Довольно часто начинающие 1С разработчики сталкиваются с ошибками, которых достаточно легко избежать. Ниже мы рассмотрим топ 11 ошибок и способы их исправления. Также доступна видеоверсия статьи
Содержание
Поле объекта не обнаружено
Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки “Поле объекта не обнаружено”. Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.
Мы же будем оперировать фактами. В конце статьи прилагается внешняя обработка, в которой воспроизведена данная ошибка.
Такое сообщение платформа выдает, когда пытается обратиться к свойству объекта языка, которого у данного объекта нет. Не важно, что это за объект – документ, справочник, таблица значений , или сообщение пользователю.
- Удалили табличную часть, к которой обращаемся в коде?
- Переименовали реквизит, а в коде не исправили?
- Заменили значение со ссылки на неопределено?
Вуаля – платформа выдаст ошибку “Поле объекта не обнаружено”!
Как исправить? Исходя из природы ошибки – переименовать реквизит на нужное имя, отредактировать код, или использовать правильные обращения к стандартным свойствам объекта.
Например, у объекта “СообщениеПользователю” нет свойства “Таблица”, и следующий код приведет к ошибке:
Сообщение = Новый СообщениеПользователю;
Сообщение.Таблица = “Ошибка”;
Индекс находится за границами массива
Что означает такое сообщение системы? Как правило, с данной ошибкой разработчик сталкивается при некорректной работе с коллекциями. Самые частые случаи появления ошибки “Индекс находится за границами массива”.
- Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов – с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
- Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
- Ошибочное увеличение счетчика в цикле “Для”
Как исправить? Для удаления элементов из коллекции по условию – использовать обратный цикл. Добавлять условие на соответствие счетчика цикла и индекса массива. Не увеличивать счетчик внутри кода цикла Для … Цикл … КонецЦикла
Обращение к процедуре как к функции
Суть этой ошибки в том, что процедура не может возвращать значение. И если мы в коде используем вызов процедуры справа от знака присваивания, это приведет к ошибке.
Данная ошибка имеет две вариации – если используется стандартная процедура из методов какого-нибудь объекта, то фраза будет звучать “Обращение к процедуре объекта как к функции”. Если же использовать процедуру, объявленную в коде, то текст ошибки будет “Обращение к процедуре как к функции”.
При этом ошибка использования процедуры объекта является ошибкой времени выполнения – т.е. на этапе сохранения и проверки конфигурации платформа эту ошибку не обнаружит.
А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.
Рассмотрим два примера:
1. Воспроизведем ошибку “Обращение к процедуре как к функции”. При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.
2. Воспроизведем ошибку “Обращение к процедуре объекта как к функции”. Здесь мы неверно используем метод объекта массива “Добавить”, который является процедурой.
Как исправить? Ошибка тривиальная, и исправление тоже. Чаще всего, достаточно внимательно прочитать описание методов объекта во встроенной справке или синтакс-помощнике. Если метод является процедурой, то значений он возвращать не может. Следовательно, нужно модифицировать код так, чтобы такого ошибочного вызова не было.
Если же используется процедура, объявленная в коде, возможно, есть необходимость изменить ее на функцию, либо также скорректировать код, который эту процедуру использует.
Процедура не может возвращать значение
Родственная предыдущей ошибка. Для того, чтобы код возвращал какое-то значение, следует этот код размещать в функции, а не в процедуре.
В процедуре можно написать ключевое слово “Возврат” без параметров. Это будет означать выход из процедуры.
Следующий код является ошибочным, т.к. в теле процедуры Возврат используется с параметром:
Процедура ПроцедураНеМожетВозвращатьЗначение(Команда) Возврат "Ошибка"; КонецПроцедуры
Как исправить? Платформа сама подсказывает, в каком месте кода ошибка. Нужно изменить текст модуля – либо удалить параметр у ключевого слова Возврат, либо убрать его вовсе, либо изменить процедуру на функцию – зависит от того, какая логика у вашей процедуры, и как вы предполагаете ее использовать.
Переменная не определена
Такой текст ошибки платформа 1С выдает на этапе синтаксического контроля, при сохранении конфигурации, внешнего отчета или обработки.
Причин у этой ошибки может быть несколько.
- Опечатка в имени переменной
- Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова “Перем”, или передана в качестве параметра)
- Написание на клиенте серверного кода. Например, обращение к менеджеру справочников “Справочники”, и т.п. Клиентская часть приложения “не видит ” серверные объекты языка
- Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.
Как исправить?
Внимательно следить за правильностью набранного кода, своевременно объявлять переменные или передавать их в качестве параметров. Писать серверный код только в серверных модулях, а также использовать соответствующие инструкции препроцессора, например “&НаСервере”.
Значение не является значением объектного типа
Ошибка “Значение не является значением объектного типа” может возникнуть при неверном обращении к объекту языка. Объектный тип – это такие объекты языка, которые содержат в себе другие объекты – свойства, реквизиты и т.п. Эти свойства доступны через точку, например “Объект.СвойствоЭтогоОбъекта”
Но если через точку попытаться использовать какое-то значение, которое внутри себя свойств не имеет – например, любое значение примитивного типа – это и приведет к ошибке.
Разберем более сложный пример:
&НаСервере Процедура ЗначениеНеЯвляетсяЗначениемОбъектногоТипаНаСервере(Справочники = Ложь) Сообщить(Справочники.Сотрудники.ПустаяСсылка()); КонецПроцедуры
Ошибка может быть “плавающей”. Если вместо параметра по умолчанию “Справочники = Ложь” будет передан менеджер справочников, то ошибки возникать не будет. А если вызвать процедуру без параметров, то будет использоваться параметр по умолчанию с типом Булево, что и приведет к ошибке.
Чаще всего чтобы исправить ошибку, нужно в отладчике посмотреть, какой тип значения используется. Можно внести изменения в код, чтобы обеспечить корректное поведение (например, в запросе вместо наименования товара выбрать ссылку, и в коде через точку уже обращаться к свойствам ссылки, а не текстового наименования). А можно добавить проверку на нужный тип значения. Т.е. – если значение того типа, который мы ожидаем – выполняем код. Иначе – не выполняем.
Ошибка при вызове метода контекста
В языке 1С у разных объектов (запросов, справочников, табличных документов и др.) есть предопределенные методы, предусмотренные платформой. Обращение к этим методам требует соблюдения порядка и параметров, правильного синтаксиса и соблюдения условий использования. Например, при чтении табличного документа из файла он не должен быть открыт в другой программе, при подключении к http-соединению оно должно быть доступно, и т.п.
Если эти условия не соблюдать, платформа в зависимости от версии может выдавать сообщения вида “Ошибка при вызове метода контекста”, и далее будут следовать более подробные сведения об ошибке – стек вызовов, приведших к ошибке, номер строки и позиции в строке, где произошла ошибка.
Чаще всего ошибка при вызове метода контекста встречается в следующих методах:
- Записать
- Прочитать
- Выполнить
- Создать
- ПроверитьВывод
Разберем эту ошибку на примере метода Выполнить объекта Запрос:
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 1 ГДЕ ИСТИНА И"); Запрос.Выполнить();
В тексте запроса допущена ошибка – после первого условия “ГДЕ ИСТИНА” указан оператор И, но после него нет еще одного условия. В результате при попытке выполнения запроса, платформа вернет ошибку.
Для исправления ошибки зачастую достаточно внимательно использовать методы, при необходимости уточнять порядок, количество и тип параметров – это можно сделать в справке или синтакс-помощнике (встать курсором на имя метода в коде, и нажать сочетание клавиш Ctrl+F1). В случае запроса – нужно передавать синтаксически корректный текст запроса; в случае проверки вывода на печать – в системе должен быть установлен принтер; в случае подключения к почте – должны быть корректно указаны логин и пароль, и т.п.
Тип не может быть выбран в запросе в 1С 8.3 (8.2)
С такой ошибкой начинающие разработчики (да и не только начинающие 😉 ) сталкиваются чаще всего, при чтении запросом данных из таблиц значений, либо из регистров сведений. Все дело в том, что запросы поддерживают далеко не все типы значений. Так, например, нельзя запросом выбрать тип Картинка, ХранилищеЗначений, Шрифт, и многие другие типы, которые не относятся к примитивным или ссылочным типам значений.
Так, если ресурс регистра сведений имеет тип ХранилищеЗначений, выбрать его запросом будет нельзя. Также, если в таблицу значений поместить значения не подходящих типов, а после передать эту таблицу в качестве параметра-источника данных, выполнение запроса также приведет к ошибке “Тип не может быть выбран в запросе”.
Еще одна ситуация, когда запрос будет выдавать ошибку – если таблица значений, которая передается в качестве параметра, имеет не типизированные колонки.
Неверно:
//ТЗОшибочныйТип.Колонки.Добавить("Контрагент");
Верно:
//ТЗОшибочныйТип.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
Для исправления ошибки нужно правильным образом инициализировать колонки таблицы значений, а также не обращаться в запросе к полям, типы которых запросами не поддерживаются.
Использование в 1С модальных окон в данном режиме запрещено
Платформа будет выдавать такое сообщение, если в коде используются методы, приводящие к открытию модальных окон. Модальные окна – это окна, которые при открытии блокируют весь остальной интерфейс. В 1С есть несколько модальных методов – например – “Вопрос”, “ОткрытьЗначение”, “Предупреждение”. Кроме того, в коде может использоваться модальный синтаксис открытия форм: “ОткрытьМодально()”
Если в свойствах конфигурации выбран режим использования модальности “Не использовать”, то выполнение модальных методов будет приводить к этой ошибке “Использование в 1С модальных окон в данном режиме запрещено”.
Для устранения ошибки можно пойти несколькими путями. Как водится, один – быстрый, другой – правильный 🙂
Быстрый способ – переключить режим использования модальности в положение “Использовать”.
Более правильный способ – использовать в коде немодальные вызовы методов. Например, у метода “Вопрос” есть немодальный аналог – “ПоказатьВопрос”, у метода “Предупреждение” – “ПоказатьПредупреждение”, и т.п. Чаще всего об этих методах дополнительно указано в синтакс-помощнике и справке.
Кроме того, в последних версиях платформы появились асинхронные методы – “ВопросАсинх”, “ПредупреждениеАсинх” и др. Появление этих методов позволяет писать более простой и понятный асинхронный код, и направлено в первую очередь, на более полноценную поддержку браузерами и работу в веб-клиенте.
1С 8.3 и 8.2: Запись с такими ключевыми полями существует!
Данная ошибка появляется при некорректной записи в регистр сведений. Чаще всего с этой ошибкой сталкиваются начинающие разработчики, не до конца понимающие механизмы работы с ключевыми полями (измерениями).
Суть ошибки следующая – регистр сведений позволяет записать запись (строку таблицы) с уникальным набором ключевых полей – а для периодических регистров также и поля Период. Если следующая запись полностью повторяет значение ключевых полей, но осуществляется методом Записать с параметром Замещать = Истина, то запись в таблице регистра просто заменится на идентичную.
Однако если поместить две абсолютно одинаковые записи в набор записей, и попытаться его записать – платформа выдаст ошибку. Еще один распространенный случай, когда 1С сообщает “Запись с такими ключевыми полями существует” – это запись в периодический регистр сведений с периодичностью от “День” и выше, подчиненный регистратору.
В типовых конфигурациях часто эту ошибку можно воспроизвести, если в пользовательском режиме создать два документа “Установка цен номенклатуры” с одной и той же номенклатурой и за один и тот же день. Попытка провести второй документ приведет к ошибке.
В случае, когда ошибка возникает не в результате действий пользователя, а при выполнении кода, чтобы устранить ее, чаще всего необходимо проанализировать алгоритм записи в регистр. Если запись осуществляется одним набором данных, его предварительно нужно свернуть до уникальных записей. Например, выгрузить в таблицу значений, свернуть, и загрузить в набор записей.
Поле объекта недоступно для записи в 1С
Чаще всего начинающие программисты 1С сталкиваются с этой ошибкой в двух ситуациях.
Первый случай – это попытка редактирования системных полей, недоступных для записи. Например, в модуле формы сама форма будет содержаться в объекте ЭтаФорма. И попытка присвоить этому реквизиту любое значение приведет к ошибке “Поле объекта недоступно для записи”.
Второй случай – и с ним новички как раз допускают больше всего ошибок – это попытка редактирования полей ссылки, а не самого объекта. Чаще всего код выглядит примерно так:
Элемент = Справочники.Сотрудники.НайтиПоКоду("12345"); Элемент.Наименование = "Новое наименование";
Исполнение данного кода приведет к ошибке, т.к. поля ссылки доступны только для чтения, а метод НайтиПоКоду вернет именно ссылку. Чтобы можно было внести изменения, следует из ссылки получить сам объект – используя соответствующий метод ПолучитьОбъект().
Для исправления ошибки зачастую достаточно получить объект из ссылки. В случае же попытки редактирования свойств, доступных только на чтение самый правильный подход – анализировать имеющуюся документацию по этим свойствам, и не пытаться присваивать им значения, если платформа этого не предусматривает.
Ссылка на обработку
По ссылке вы можете скачать внешнюю обработку, в которой воспроизводится большая часть ошибок, описанных в статье. Для воспроизведения части ошибок нужно будет убрать комментарии в коде.
Заключение
Как видите, зачастую ошибки тривиальны, и достаточно просто исправляются. Общие рекомендации – внимательно читать документацию и справку, корректно использовать методы, активно пользоваться отладчиком. Если вы новичок, и хотите освоить программирование в 1С с нуля – могу предложить приобрести мой базовый курс для начинающих. Более подробная информация – по ссылке.
Довольно часто начинающие 1С разработчики сталкиваются с ошибками, которых достаточно легко избежать. Ниже мы рассмотрим топ 11 ошибок и способы их исправления. Также доступна видеоверсия статьи
Содержание
Поле объекта не обнаружено
Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки “Поле объекта не обнаружено”. Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.
Мы же будем оперировать фактами. В конце статьи прилагается внешняя обработка, в которой воспроизведена данная ошибка.
Такое сообщение платформа выдает, когда пытается обратиться к свойству объекта языка, которого у данного объекта нет. Не важно, что это за объект – документ, справочник, таблица значений , или сообщение пользователю.
- Удалили табличную часть, к которой обращаемся в коде?
- Переименовали реквизит, а в коде не исправили?
- Заменили значение со ссылки на неопределено?
Вуаля – платформа выдаст ошибку “Поле объекта не обнаружено”!
Как исправить? Исходя из природы ошибки – переименовать реквизит на нужное имя, отредактировать код, или использовать правильные обращения к стандартным свойствам объекта.
Например, у объекта “СообщениеПользователю” нет свойства “Таблица”, и следующий код приведет к ошибке:
Сообщение = Новый СообщениеПользователю;
Сообщение.Таблица = “Ошибка”;
Индекс находится за границами массива
Что означает такое сообщение системы? Как правило, с данной ошибкой разработчик сталкивается при некорректной работе с коллекциями. Самые частые случаи появления ошибки “Индекс находится за границами массива”.
- Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов – с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
- Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
- Ошибочное увеличение счетчика в цикле “Для”
Как исправить? Для удаления элементов из коллекции по условию – использовать обратный цикл. Добавлять условие на соответствие счетчика цикла и индекса массива. Не увеличивать счетчик внутри кода цикла Для … Цикл … КонецЦикла
Обращение к процедуре как к функции
Суть этой ошибки в том, что процедура не может возвращать значение. И если мы в коде используем вызов процедуры справа от знака присваивания, это приведет к ошибке.
Данная ошибка имеет две вариации – если используется стандартная процедура из методов какого-нибудь объекта, то фраза будет звучать “Обращение к процедуре объекта как к функции”. Если же использовать процедуру, объявленную в коде, то текст ошибки будет “Обращение к процедуре как к функции”.
При этом ошибка использования процедуры объекта является ошибкой времени выполнения – т.е. на этапе сохранения и проверки конфигурации платформа эту ошибку не обнаружит.
А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.
Рассмотрим два примера:
1. Воспроизведем ошибку “Обращение к процедуре как к функции”. При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.
2. Воспроизведем ошибку “Обращение к процедуре объекта как к функции”. Здесь мы неверно используем метод объекта массива “Добавить”, который является процедурой.
Как исправить? Ошибка тривиальная, и исправление тоже. Чаще всего, достаточно внимательно прочитать описание методов объекта во встроенной справке или синтакс-помощнике. Если метод является процедурой, то значений он возвращать не может. Следовательно, нужно модифицировать код так, чтобы такого ошибочного вызова не было.
Если же используется процедура, объявленная в коде, возможно, есть необходимость изменить ее на функцию, либо также скорректировать код, который эту процедуру использует.
Процедура не может возвращать значение
Родственная предыдущей ошибка. Для того, чтобы код возвращал какое-то значение, следует этот код размещать в функции, а не в процедуре.
В процедуре можно написать ключевое слово “Возврат” без параметров. Это будет означать выход из процедуры.
Следующий код является ошибочным, т.к. в теле процедуры Возврат используется с параметром:
Процедура ПроцедураНеМожетВозвращатьЗначение(Команда) Возврат "Ошибка"; КонецПроцедуры
Как исправить? Платформа сама подсказывает, в каком месте кода ошибка. Нужно изменить текст модуля – либо удалить параметр у ключевого слова Возврат, либо убрать его вовсе, либо изменить процедуру на функцию – зависит от того, какая логика у вашей процедуры, и как вы предполагаете ее использовать.
Переменная не определена
Такой текст ошибки платформа 1С выдает на этапе синтаксического контроля, при сохранении конфигурации, внешнего отчета или обработки.
Причин у этой ошибки может быть несколько.
- Опечатка в имени переменной
- Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова “Перем”, или передана в качестве параметра)
- Написание на клиенте серверного кода. Например, обращение к менеджеру справочников “Справочники”, и т.п. Клиентская часть приложения “не видит ” серверные объекты языка
- Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.
Как исправить?
Внимательно следить за правильностью набранного кода, своевременно объявлять переменные или передавать их в качестве параметров. Писать серверный код только в серверных модулях, а также использовать соответствующие инструкции препроцессора, например “&НаСервере”.
Значение не является значением объектного типа
Ошибка “Значение не является значением объектного типа” может возникнуть при неверном обращении к объекту языка. Объектный тип – это такие объекты языка, которые содержат в себе другие объекты – свойства, реквизиты и т.п. Эти свойства доступны через точку, например “Объект.СвойствоЭтогоОбъекта”
Но если через точку попытаться использовать какое-то значение, которое внутри себя свойств не имеет – например, любое значение примитивного типа – это и приведет к ошибке.
Разберем более сложный пример:
&НаСервере Процедура ЗначениеНеЯвляетсяЗначениемОбъектногоТипаНаСервере(Справочники = Ложь) Сообщить(Справочники.Сотрудники.ПустаяСсылка()); КонецПроцедуры
Ошибка может быть “плавающей”. Если вместо параметра по умолчанию “Справочники = Ложь” будет передан менеджер справочников, то ошибки возникать не будет. А если вызвать процедуру без параметров, то будет использоваться параметр по умолчанию с типом Булево, что и приведет к ошибке.
Чаще всего чтобы исправить ошибку, нужно в отладчике посмотреть, какой тип значения используется. Можно внести изменения в код, чтобы обеспечить корректное поведение (например, в запросе вместо наименования товара выбрать ссылку, и в коде через точку уже обращаться к свойствам ссылки, а не текстового наименования). А можно добавить проверку на нужный тип значения. Т.е. – если значение того типа, который мы ожидаем – выполняем код. Иначе – не выполняем.
Ошибка при вызове метода контекста
В языке 1С у разных объектов (запросов, справочников, табличных документов и др.) есть предопределенные методы, предусмотренные платформой. Обращение к этим методам требует соблюдения порядка и параметров, правильного синтаксиса и соблюдения условий использования. Например, при чтении табличного документа из файла он не должен быть открыт в другой программе, при подключении к http-соединению оно должно быть доступно, и т.п.
Если эти условия не соблюдать, платформа в зависимости от версии может выдавать сообщения вида “Ошибка при вызове метода контекста”, и далее будут следовать более подробные сведения об ошибке – стек вызовов, приведших к ошибке, номер строки и позиции в строке, где произошла ошибка.
Чаще всего ошибка при вызове метода контекста встречается в следующих методах:
- Записать
- Прочитать
- Выполнить
- Создать
- ПроверитьВывод
Разберем эту ошибку на примере метода Выполнить объекта Запрос:
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 1 ГДЕ ИСТИНА И"); Запрос.Выполнить();
В тексте запроса допущена ошибка – после первого условия “ГДЕ ИСТИНА” указан оператор И, но после него нет еще одного условия. В результате при попытке выполнения запроса, платформа вернет ошибку.
Для исправления ошибки зачастую достаточно внимательно использовать методы, при необходимости уточнять порядок, количество и тип параметров – это можно сделать в справке или синтакс-помощнике (встать курсором на имя метода в коде, и нажать сочетание клавиш Ctrl+F1). В случае запроса – нужно передавать синтаксически корректный текст запроса; в случае проверки вывода на печать – в системе должен быть установлен принтер; в случае подключения к почте – должны быть корректно указаны логин и пароль, и т.п.
Тип не может быть выбран в запросе в 1С 8.3 (8.2)
С такой ошибкой начинающие разработчики (да и не только начинающие 😉 ) сталкиваются чаще всего, при чтении запросом данных из таблиц значений, либо из регистров сведений. Все дело в том, что запросы поддерживают далеко не все типы значений. Так, например, нельзя запросом выбрать тип Картинка, ХранилищеЗначений, Шрифт, и многие другие типы, которые не относятся к примитивным или ссылочным типам значений.
Так, если ресурс регистра сведений имеет тип ХранилищеЗначений, выбрать его запросом будет нельзя. Также, если в таблицу значений поместить значения не подходящих типов, а после передать эту таблицу в качестве параметра-источника данных, выполнение запроса также приведет к ошибке “Тип не может быть выбран в запросе”.
Еще одна ситуация, когда запрос будет выдавать ошибку – если таблица значений, которая передается в качестве параметра, имеет не типизированные колонки.
Неверно:
//ТЗОшибочныйТип.Колонки.Добавить("Контрагент");
Верно:
//ТЗОшибочныйТип.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
Для исправления ошибки нужно правильным образом инициализировать колонки таблицы значений, а также не обращаться в запросе к полям, типы которых запросами не поддерживаются.
Платформа будет выдавать такое сообщение, если в коде используются методы, приводящие к открытию модальных окон. Модальные окна – это окна, которые при открытии блокируют весь остальной интерфейс. В 1С есть несколько модальных методов – например – “Вопрос”, “ОткрытьЗначение”, “Предупреждение”. Кроме того, в коде может использоваться модальный синтаксис открытия форм: “ОткрытьМодально()”
Если в свойствах конфигурации выбран режим использования модальности “Не использовать”, то выполнение модальных методов будет приводить к этой ошибке “Использование в 1С модальных окон в данном режиме запрещено”.
Для устранения ошибки можно пойти несколькими путями. Как водится, один – быстрый, другой – правильный 🙂
Быстрый способ – переключить режим использования модальности в положение “Использовать”.
Более правильный способ – использовать в коде немодальные вызовы методов. Например, у метода “Вопрос” есть немодальный аналог – “ПоказатьВопрос”, у метода “Предупреждение” – “ПоказатьПредупреждение”, и т.п. Чаще всего об этих методах дополнительно указано в синтакс-помощнике и справке.
Кроме того, в последних версиях платформы появились асинхронные методы – “ВопросАсинх”, “ПредупреждениеАсинх” и др. Появление этих методов позволяет писать более простой и понятный асинхронный код, и направлено в первую очередь, на более полноценную поддержку браузерами и работу в веб-клиенте.
1С 8.3 и 8.2: Запись с такими ключевыми полями существует!
Данная ошибка появляется при некорректной записи в регистр сведений. Чаще всего с этой ошибкой сталкиваются начинающие разработчики, не до конца понимающие механизмы работы с ключевыми полями (измерениями).
Суть ошибки следующая – регистр сведений позволяет записать запись (строку таблицы) с уникальным набором ключевых полей – а для периодических регистров также и поля Период. Если следующая запись полностью повторяет значение ключевых полей, но осуществляется методом Записать с параметром Замещать = Истина, то запись в таблице регистра просто заменится на идентичную.
Однако если поместить две абсолютно одинаковые записи в набор записей, и попытаться его записать – платформа выдаст ошибку. Еще один распространенный случай, когда 1С сообщает “Запись с такими ключевыми полями существует” – это запись в периодический регистр сведений с периодичностью от “День” и выше, подчиненный регистратору.
В типовых конфигурациях часто эту ошибку можно воспроизвести, если в пользовательском режиме создать два документа “Установка цен номенклатуры” с одной и той же номенклатурой и за один и тот же день. Попытка провести второй документ приведет к ошибке.
В случае, когда ошибка возникает не в результате действий пользователя, а при выполнении кода, чтобы устранить ее, чаще всего необходимо проанализировать алгоритм записи в регистр. Если запись осуществляется одним набором данных, его предварительно нужно свернуть до уникальных записей. Например, выгрузить в таблицу значений, свернуть, и загрузить в набор записей.
Поле объекта недоступно для записи в 1С
Чаще всего начинающие программисты 1С сталкиваются с этой ошибкой в двух ситуациях.
Первый случай – это попытка редактирования системных полей, недоступных для записи. Например, в модуле формы сама форма будет содержаться в объекте ЭтаФорма. И попытка присвоить этому реквизиту любое значение приведет к ошибке “Поле объекта недоступно для записи”.
Второй случай – и с ним новички как раз допускают больше всего ошибок – это попытка редактирования полей ссылки, а не самого объекта. Чаще всего код выглядит примерно так:
Элемент = Справочники.Сотрудники.НайтиПоКоду("12345"); Элемент.Наименование = "Новое наименование";
Исполнение данного кода приведет к ошибке, т.к. поля ссылки доступны только для чтения, а метод НайтиПоКоду вернет именно ссылку. Чтобы можно было внести изменения, следует из ссылки получить сам объект – используя соответствующий метод ПолучитьОбъект().
Для исправления ошибки зачастую достаточно получить объект из ссылки. В случае же попытки редактирования свойств, доступных только на чтение самый правильный подход – анализировать имеющуюся документацию по этим свойствам, и не пытаться присваивать им значения, если платформа этого не предусматривает.
Ссылка на обработку
По ссылке вы можете скачать внешнюю обработку, в которой воспроизводится большая часть ошибок, описанных в статье. Для воспроизведения части ошибок нужно будет убрать комментарии в коде.
Заключение
Как видите, зачастую ошибки тривиальны, и достаточно просто исправляются. Общие рекомендации – внимательно читать документацию и справку, корректно использовать методы, активно пользоваться отладчиком. Если вы новичок, и хотите освоить программирование в 1С с нуля – могу предложить приобрести мой базовый курс для начинающих. Более подробная информация – по ссылке.
Ошибки, как правило, совершают начинающие программисты, не имеющие достаточного опыта в своей деятельности. Можно эти ошибки по разному классифицировать. Мы же в рамках статьи разделим их на две группы. В конечном итоге они приводят к:
- неоправданному расходу ресурсов компьютера (сервера);
- искажению данных при чтении или записи.
Содержание
- Получение данных не из регистра
- Запрос в цикле и обращение через точку
- Ошибки в запросах к таблицам регистров
- Неверный контекст выполнения процедур и функций
Получение данных не из регистра
Достоверной информацией учетной системы принято считать данные регистров. Если же какой-либо отчет получает данные из таблиц документов, то это является грубой ошибкой. Данное решение очень медленно работает, может приводить к ошибкам блокировок, не является гибким и может давать искажение результатов отчета.
То есть правильно придерживаться такой схемы:
Документ – Регистр – Отчет.
Запрос в цикле и обращение через точку
Примером такой ошибки является конструкция типа:
Пока Выборка.Следующий() Цикл
А = Выборка.Ссылка.Договор;
КонецЦикла;
Как видим, внутри цикла мы делаем так называемый неявный запрос.
Тем самым, во-первых, мы расходуем ресурсы. В цикле может быть огромное число итераций, в каждую из которых система выполнит запрос.
Во-вторых, даже без цикла такая конструкция неоптимальна, потому что платформа инициализирует все поля объекта Выборка.Ссылка.
Да, новичкам так банально проще писать, но это грубая ошибка с точки зрения производительности. Правильно запросом получить необходимый набор полей.
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка,
ПоступлениеТоваровУслуг.Ссылка.Договор
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ ПоступлениеТоваровУслуг.Ссылка = &Ссылка
Ошибки в запросах к таблицам регистров
Грубейшей ошибкой является использование конструкции ГДЕ … в запросе к таблице регистра накопления вместо того, чтобы установить отбор в параметрах виртуальной таблицы.
Также часто начинающие забывают при левом соединении накладывать фильтр в параметрах виртуальной таблицы, если Вы присоединяете записи виртуальной таблицы.
Приведем пример:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Номенклатура,
ПоступлениеТоваровУслугТовары.Количество,
ЦеныНоменклатурыСрезПервых.Цена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПервых КАК ЦеныНоменклатурыСрезПервых
ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПервых.Номенклатура
В этом случае платформа выберет все записи таблицы регистра сведений “Цены номенклатуры”, а потом отбросит ненужные. Результат Вы получите, только система потратит впустую ресурсы.
Неверный контекст выполнения процедур и функций
При разработке в режиме управляемого приложения мы можем использовать так называемые директивы компиляции – &НаКлиенте, &НаСервере, &НаСервереБезКонтекста и прочие.
Так вот при написании кода необходимо понимать суть клиент-серверной архитектуры. Новички же часто весь код выполняют на сервере, потому что им так проще. Но в таком случае опять может происходить напрасная трата ресурсов сервера. Если говорить совсем просто, необходимо стремиться избавить сервер от лишней работы, а также избегать напрасной передачи всех данных формы на сервер и обратно.
Автор в рамках данной статьи не ставит своей целью показать все ошибки начинающих программистов. Ошибок много (как и программистов), и их делают все, но самое главное в процессе работы – не совершать их в будущем. А для этого необходимо постоянно работать над повышением своей квалификации.
Рекомендуем Вам делать “аудит” своих работ, которые имеют определенный срок давности.
Содержание
1. Ошибки программистов и удаленных разработчиков
2. Ошибки аналитиков – консультантов
3. Ошибки при оценке последовательности проведения работ
Для кого эта статья? Если вы руководитель проектов (РП) с опытом «от трех проектов», то можете не читать: скорее всего, ничего нового вы не узнаете. А если вы хотите стать РП в проектах 1С или вы профессионал (разработчик, аналитик, консультант), к которому часто обращаются за оценкой, то вам будет полезно узнать о типичных ошибках при оценке.
Если вам необходимо реализовать задачу, которую не имеет смысла делать по классической проектной технологии, но заказчик требует фиксированной оценки, и задача на 2-5 человеко-месяцев, — то вам будет полезно понять методы оценки работ.
Если читатель часто пользуется услугами удаленных разработчиков/аналитиков, то вам, возможно, станет понятно, почему «человек все сделал, мы ему заплатили, сколько сказал, а он от нас ушел и больше работать не хочет».
Типичные ошибки распределю по классам.
1. Ошибки программистов и удаленных разработчиков
1.1. Недооценка времени на тестирование и исправление.
Подумайте, вы правда умеете программировать сразу без ошибок? Если нет, смело закладывайте время на тестирование. Сколько? Зависит от задачи – вы профессионал, вам виднее.
1.2. Недооценка времени на уточнение формулировок задачи проекта.
Вам сразу понятно ТЗ? Точно сразу? Вы точно понимаете, что постановщик задачи вам сказал? Скорее всего нет. И это правильно – полностью формализовать ТЗ до уровня всех алгоритмов никто не будет (а особенно заказчик). А это значит, что вам придется уточнять постановку задачи. И это нормально. Заложите на это время, если задача большая.
1.3. Недооценка времени на подготовку к работе.
Где будет происходить разработка? У вас на компьютере? На сервере заказчика? На сервере компании? А база уже развернута? А есть доступ? А получен ли cf, если «конфигурация заказчика немного изменена»? Эти вопросы надо задать и понять, потребуется ли время на подготовку. Если потребуется, и подготавливать будете Вы, включайте время в оценку.
1.4. Недооценка сдачи-приемки.
Подумайте, кому и каким образом вы будете сдавать работу? Что для этого потребуется? Сколько это займет времени? Вы сдаете работу не одному человеку, а нескольким (такое бывает)?
1.5. Недооценка окружения.
Заказчик использует хранилище конфигурации, разработка ведется в расширении, «вот вам простой и понятный регламент работы и документирования кода всего на 25 страницах»? Если вы с этим работали, то понимаете: на сколько умножить, если работа с хранилищем; на сколько, если с расширением; сколько процентов на страницу регламента закладывать. Если не работали – смело умножайте на 1.5 за каждый вид неопределенности. Скорее всего, все равно не угадаете, но это будет не так обидно.
1.6. Не указали границы.
Вы оценивали, как будто будете делать у себя, а заказчик сказал, что вся разработка только у него на сервере, а там см. предыдущий пункт. И, конечно же, при постановке задачи этого не было сказано.
Тут 100% действующего рецепта нет – при постановке задачи не сказать могут что угодно. Если условия неизвестны, пишите свои предположения и их считайте «границей». Если вы имели ввиду, что вы только кодируете, только у себя, а в качестве сдачи-приемки отправляете cf по почте – напишите. Заказчик либо согласится, либо задумается и скажет: «Нет, я хочу, чтобы вы мне тестовый стенд развернули и показали, как это работает». Тогда вы уже вступаете в конструктивный диалог: «А тогда это будет стоить еще…». В любом случае, вы не будете работать бесплатно: если выяснится, что заказчик не готов за что-то платить, вы сами примете решение, готовы вы что-то сделать за бесплатно, или пусть поищет кого другого.
Указанные пункты не являются панацеей. Ошибиться с оценкой можно даже учтя их все, например, автор регулярно так делает (в смысле ошибается с оценкой).
2. Ошибки аналитиков – консультантов
Если вы программист, но задачи вам ставит заказчик, то вы выполняете и эту работу тоже. Можно смело читать.
2.1. Правильно расписана последовательность работ.
Вы же понимаете, как будете решать поставленную задачу? В какой последовательности? Что будет результатом? Если понимаете, то напишите эту последовательность. Лучше всего в MSProject. Так вам станет понятно, когда вы на самом деле сделаете задачу.
2.2. Не заложен резерв под исправление ошибок.
Может ли ваш результат содержать ошибки? Скажем, в инструкции? Если может, то закладывайте время на исправление ошибок.
2.3. Не заложен резерв под сдачу-приемку выполненных работ.
Как вы будете сдавать работу? Кому? Сколько это на самом деле займет времени? Надо ли будет куда-то ехать? Надо ли там кого-то ждать? Сможете ли вы сделать что-то еще, если поедете сдавать задачу к заказчику на Рябиновую улицу к 15? Если нет, то почему бы не включить часы вынужденного простоя в часы работы на заказчика, из-за которого этот простой вызван?
2.4. Не учитываете транзакционные издержки.
Что это такое? Очень просто. Например, у вас мини-проект и вы договорились о серии интервью для уточнения задачи. И вот первое интервью у вас в 10:00, а второе в 15:00. Чем вы будете заниматься между ними?
Далее. Вы отправили заказчику вопрос. Он точно вам сразу же ответит? А если нет, что вы будете делать, пока ждете ответа? А кто оплатит время вынужденного простоя?
Вы планируете обучение для сотрудников заказчика и предполагаете, что потребуется 40 часов, т.е. рабочая неделя. А сможет ли заказчик выделить своих очень занятых сотрудников на неделю? Нет конечно. А как это будет?
Все такого рода задержки как раз и называются транзакционными издержками. Избежать их полностью не удастся. Я считаю честным подходом рассказать о них заказчику, чтобы он тоже подумал, как бы так организовать работу, чтобы их избежать таких издержек, и не платить вам за простой. Но в каждом конкретном случае решать тому, кто дает оценку.
2.5. Не фиксируете результат, либо фиксируете нечетко.
Это сочетается с пунктов 2.3, 2.4. Подумайте, что будет результатом вашей работы. Если сложно понять, обратитесь к более опытным товарищам, которые объяснят, например, что результат интервью – это протокол, что инструкция по работе – тоже результат. И возвращаясь к п.2.3: сразу подумайте, как вы будете это сдавать, и что является критерием корректно полученного результата. Это избавит вас от прекрасных формулировок вида «корректная работающая система, формирующая правильные проводки» (сам такие делал). Если описание результата допускает двоякую трактовку – будьте уверены, вы с Заказчиком поймете по-разному. Если не допускает, то тоже поймете по-разному, но вам по крайней мере будет что сказать.
3. Ошибки при оценке последовательности проведения работ
Тут пойдет речь об оценке мини-проектов, где будет работать не только аналитик, но и разработчик (или два). В качестве тимлида в таких конструкциях обычно выступает аналитик, который и общается с заказчиком, ставит ТЗ, принимает работы у разработчиков и сдает результат Заказчику.
3.1. Неправильно указана последовательность проведения работ.
Подумайте, как команда будет делать проект. Постарайтесь хотя бы не планировать так, чтобы кто-то делал одновременно две задачи. В реальности все равно так случится и тогда количество одновременных задач умножится на два. Если у вас запланированы две задачи одновременно, то будьте уверены – в какой-то момент их станет 4.
Помните, что разработчики ошибаются с оценкой (см раздел 1).
Помните, что нельзя писать инструкцию по неразработанному функционалу (например).
3.2. Не учтены транзакционные издержки.
Как будет происходить передача задачи от вас программисту? А от программиста к вам? Что он будет делать, пока вы проверяете результат?
3.3. Перегрузка ресурсов.
У вас проект на 9 человеко-месяцев, а надо сделать за один. Казалось бы, берем 9 программистов, и они все сделают за месяц. Но нет! Если один аналитик и девять программистов, то задача будет делаться скорее всего около года. Да-да, та самая, на 9 человеко-месяцев.
Не ваш случай? Так если у вас шесть программистов на 50% загрузки, то это хуже, чем 3 на 100%.
Почему? Потому что как бы не была декомпозирована задача, как бы вы не написали ТЗ, вам будут задавать вопросы при разработке (те самые, из п.1.2) Одному человеку вы объясните один раз. Шести – шесть. И вопросов будет в 6 раз больше.
3.4. Ошибки окружения.
Если у вас работает несколько разработчиков, надо понимать, как вы будете объединять плоды их трудов. Кто и как это будет делать. Каким функционалом. Если будете объединять разные доработки в одной конфигурации, то не забудьте, что делая одно можно сломать другое. И лучше будет, если вы сами это обнаружите, чем «прилетит» от заказчика. А значит, надо заложить дополнительное время на все указанное выше.
Список кончено не исчерпывающий, но основное я указал. Теперь абзац для заказчиков.
Итак, уважаемые заказчики, если вы – получатель оценки, то надо все эти вопросы (из пунктов 1-2) задавать вашему исполнителю. Иначе может получиться, что ваш исполнитель получит существенно меньше, чем потратит времени. А вам-то что? Очень просто: он пару раз с вами поработает, а потом решит, что ему так не надо. И либо скажет, что больше не хочет так работать, либо просто исчезнет (хорошо если без предоплаты). Потому если вы нацелены на долгое сотрудничество – задавайте эти вопросы. Цените специалистов, проводящих работы в программе 1С, их и так мало!
Специалист компании «Кодерлайн»
Иван Аюпов
Программисты 1С, особенно начинающие, часто допускают одни и те же ошибки, которые могут обнаружиться не сразу. И чтобы вы могли проверить себя и предотвратить попадание на эти распространённые грабли, мы составили этот список. Ошибки были описаны по ходу прохождения курса «1С:Специалист по платформе», поэтому список будет так же полезен для тех, кто собирается проходить сертификацию.
Ниже мы опишем, на наш взгляд, самые распространённые недочёты в написании кода и проектировании, а так же, дадим рекомендации по их устранению и недопущению.
1. Получение данных в цикле.
Распространенная ошибка — запрос в цикле. Многократный вызов запроса является грубой ошибкой, существенно снижающей производительность. Это происходит не только в текущем сеансе, но и затрудняет работу других пользователей (например, в случае открытой транзакции в момент выполнения кода).
Правильный подход: проектировать код так, чтобы запросы выполнялись перед циклами, получая все необходимые для дальнейшей обработки данные.
2. Вместо параметров виртуальной таблицы использование условий «ГДЕ».
Ещё одна грубая ошибка, в основном, начинающих разработчиков 1С. В случаях, когда это возможно, в запросах нужно использовать параметры виртуальных таблиц, таких как Остатки, ОстаткиИОбороты, СрезПоследних и т. п. Использование параметров в них избавляет СУБД от необходимости обработки избыточных объёмов данных. Если же поступать наоборот: виртуальную таблицу оставляем без параметров, а отборы накладываем в разделе запроса ГДЕ, то получаем, что СУБД выберет все данные из виртуальной таблицы (которые не нужны), и начнёт их фильтровать в ГДЕ, на что затратит лишнее время процессора, память и т. п., в то время, как можно было эти лишние данные просто не получать.
3. Отсутствие проверки на NULL.
При соединении таблиц в запросе необходимо предотвратить значение NULL, которое может «наделать дел» при обработке результата запроса. Как известно, значение NULL практически не пригодно к обработке: его почти не с чем сравнить, нельзя превратить в строку и т. д. По этому, когда оно попадается, то это чаще всего приводит к ошибке преобразования типов или ошибке сравнения несовместимых типов. Беда в том, что на контрольных примерах эту ошибку можно и не отловить, а на живой базе с разнообразием исходных данных она может себя показать лишь через длительное время. По этому, в запросах принято использовать ЕстьNull(), когда есть вероятность возникновения таких значений, чтобы их не допустить.
4. Получение данных не из регистра.
Самым достоверным источником информации является регистр, а не документ, как бы этого не хотелось… Например, из-за ручной операции, которая делает записи в регистр интерактивно. Иными словами, если брать данные для какого-нибудь отчёта или обработки из документа, а не из регистра, то можно столкнуться с тем, что данные в документе будут неактуальны. Это может произойти в случае, если записи регистра изменены документом «корректировка регистров» или документом закрытия месяца, который тоже иногда изменяет записи прямо у документов и т.п..
5. Остатки нельзя вывести в ноль.
Если программное решение не позволяет вывести в ноль все ресурсы регистра, то это является ошибкой. В случае, если вы используете регистр накопления остатков, в который пишете, к примеру, только движения прихода по одному из ресурсов, то такое решение приводит к «раздуванию» технологических таблиц хранения остатков. Как следствие, это уже приведёт к ненужному увеличению всей базы данных и к замедлению работы каких-нибудь алгоритмов или отчётов, захламляя их избыточными устаревшими остатками.
6. Ресурсы регистра изменяются только в одну сторону.
То есть, только в «+» или только в «-«. Это приведет к переполнению таблиц итогов, что является частным случаем вышеописанной проблемы.
7. Отсутствие проверок для корректного заполнения ресурсов регистра.
Например, отсутствует проверка на остаток товара, которая поможет пользователю избежать отрицательного остатка. Из-за нехватки времени или заниженных требований качества у разработчиков иногда появляется соблазн сделать рабочий код, но не продумать защиту от неловких действий пользователя. Ситуация, когда программа работает, но «шаг влево, шаг вправо» и в регистрах копятся самые банальные косяки…
8. Нерешённая или неправильно решенная «Проблема копеек».
Пример: на остатке 3 товара стоимостью 100,00 руб. Нам нужно рассчитать стоимость списания каждого и списать.
Формула расчёта стоимости списания:
Себестоимость Остаток / Количество Остаток * Количество Списания = 33,33 * 3 = 99,99 руб.
После списания остается 0 шт и 1 копейка, что является частным случаем не вывода ресурсов регистра в ноль.
Возможное решение: проверять при каждом списании совпадает ли количество с остатком по регистру. Если количество совпало, то сумму мы не рассчитываем по формуле, а берём из остатка по регистру, таким образом, попутно выводя этот ресурс в ноль.
9. Использование информации по оборотам при получении итогов по остаткам и наоборот.
Суть ошибки заключается в неправильном использовании виртуальных таблиц регистров накопления. Если нужно получить данные остатков на момент времени, нужно использовать таблицу Остатки, а не вычислять остаток как Приход минус Расход. Если нужно получить данные за период (например, приход денег за месяц), то нужно использовать таблицу Обороты, а не ОстаткиИОбороты, чтобы не получать избыточные данные остатков, которые не будут использоваться.
10. Обращение к реальным таблицам регистра без необходимости.
В отличие от реальной таблицы, виртуальная таблица с заполненными параметрами в разы сокращает количество получаемой информации, с которой мы планируем в дальнейшем работать. При больших объемах данных использование виртуальных таблиц может существенно ускорить выполнение запроса. Проще всего определить, что таблица является виртуальной, можно по доступности кнопки «Параметры виртуальной таблицы» при выборе таблицы в конструкторе запроса.
11. Установка отборов по неиндексированным полям.
«ИНДЕКСИРОВАТЬ ПО» нужно использовать на полях виртуальной таблицы, по которым будет выполнено соединение этой виртуальной таблицы с другими таблицами. Индексирование повышает скорость соединения таблиц, но только если в виртуальной таблице достаточно большое количество записей, т.к. само построение индекса занимает некоторое время и оно нецелесообразно на небольших объёмах.
12. Не предусмотрено «движение назад».
Всегда должна быть возможность «откатить» цепочку действий в исходное положение. При отмене проведения документа, данные регистров, реквизиты документа и прочие изменения, которые произошли с проведением, должны вернуться на тот момент, как было до проведения. Таким образом, всегда можно будет посмотреть, что было с данными до каких-либо изменений.
13. Не предусмотрено перепроведение документа задним числом.
При проведении документа задним числом нужно получать остатки и другие данные (например, курс валюты) на дату проводимого документа, а не на текущий момент времени. Так же, важно учесть связанные с перепроводимым документы. Например, при перепроведении приходной накладной задним числом (товара было 3 шт., а стало 1 шт.), расходная накладная на 3 штуки товара будет уже некорректной.
14. Не отработаны дубли строк в документах при проведении.
Чтобы избежать проблем с движениями, нужно заранее сгруппировать строки табличной части документа. Например, в табличной части документа расходной накладной есть первая и третья строка с 1 штукой одного и того же товара. На остатке 1 штука. На момент проверки остатков по первой строке их будет хватать. Когда алгоритм дойдет до третьей строки, на остатках уже не должно быть этого товара, но движения еще не были сформированы и ошибки не будет. В итоге движения будут некорректными. Чтобы этого избежать, нужно передать в алгоритм проведения сразу 2 штуки объединённые в одну строку.
15. Неверное соединение таблиц.
Есть несколько видов соединений таблиц в запросах. Левое, когда нужно к одной таблице добавить определенные свойства другой таблицы. Правое соединение аналогично левому, только главной таблицей является вторая. Внутреннее, когда нужно отобрать по условиям соединения определенные записи из обеих таблиц. И полное, когда нужно получить все записи из обеих таблиц. Важно понимать, какое соединение подходит для решения поставленной задачи, дабы избежать избыточных действий с данными.
16. Неверное определение вида регистра накопления.
Регистр накопления остатков хранит остатки и обороты, а регистр накопления оборотов — только обороты. Поэтому, если смысла хранить остатки нет (например, регистр накопления «Продажи», который хранит только информацию об обороте продаж), то вид регистра должен быть «Обороты». Определение такому регистру вида «Остатки» приведет к накоплению избыточной информации.
Придерживайтесь этих правил не только во время подготовки к экзаменам, но и в повседневной работе, чтобы обеспечить профессиональный уровень качества кода.
Автор Максим Багров, редактор Илья Ильин.
№ |
Объект |
Описание ошибки | Примеры |
1 |
Запрос |
Счетчик в запросе необходимо писать через ё, т.е. СЧЁТЧИК | | Количество = счётчик(Док) |
2 |
Процедура (Функция) |
Точка с запятой после названия процедуры (функции) и скобок
НЕ ставится |
МояПроцедура(а, в) |
3 |
Процедура (Функция) |
Если существуют процедуры (функции), которые стоят ниже чем
вызывающая их процедура (функция), то необходимо указывать директивы «Далее» для этих процедур (функций) |
Процедура ПроцедураКотораяВызыватеся() Далее Процедура ИзКоторойВызывается() … ПроцедураКотораяВызывается() … КонецПроцедуры ПроцедураКотораяВызывается() … КонецПроцедуры |
4 | Процедура (функция), переменная | Чтобы сделать видимой переменную за пределами модуля необходимо
наличие директивы Экспорт для этой переменной |
в глобальном модуле: МояПеременная Экспорт; |
5 | Форма | Запрещается использовать одинаковые имена переменных и имен
реквизитов формы |
|
6 | Периодический | Для получения значения периодического реквизита НЕ забывайте
указывать ИспользоватьДату() |
|
7 | Документ | Попытка создать операцию для документа, в котором отсутствует
принадлежность к бухгалтерскому учету, попытка создать движения по регистрам, в которых отсутствует принадлежность к оперативному учету |
|
8 | Радиокнопка | Неправильная работа радиокнопки при неправильном указании
порядка обхода и указании первого в группе |
|
9 | Таблица | Не забывайте при написании отчета писать Таб.Показать() |
Таб = СоздатьОбъект(«Таблица»); … Таб.Показать() |
10 | Документ | Не забывайте в конце модуля документа, принадлежащего к бух.
учету писать Операция.Записать(); |
Процедура ОбработкаПроведения() … Операция.Записать(); КонецПроцедуры |
11 | Периодический | Попытка записать периодический реквизит справочника из документа,
у которого нет галочки «Изменяется документами» |
Как уменьшить НДФЛ на сумму аванса за трудовой патент иностранца
Иностранные граждане из стран, с которыми у России установлен безвизовый режим, должны оформлять трудовой патент, чтобы легально работать у российских работодателей. За такой патент они платят авансовые платежи по НДФЛ, а работодатель, в свою очередь, выплачивает НДФЛ из зарплаты иностранца. Получается двойное налогообложение, но его можно избежать.
Зачем и как главные бухгалтеры уходят из найма и работают на себя
Я Екатерина Сидиченко, и уже более 10 лет занимаюсь развитием бухгалтерского бизнеса. Управляю собственными офисами бухгалтерского сопровождения в Красноярске и Москве, являюсь сооснователем франшизной сети бухгалтерских агентств BILLPROF, в которой с 2016 года было открыто более 60 офисов.
В предыдущей публикации я писал, что мы рассмотрим ошибки 1С программиста за которые, на мой взгляд, точно никто не похвалит…
И так, ошибка номер 1
Предисловие:
_Ошибка связана с проведением и контролем остатков. Может возникнуть при доработке типового документа или разработке нетипового._
_Опытный 1С программист вряд-ли ее допустит, но новичок вполне может упустить один важный момент._
Предположим, что мы разрабатываем самописную конфигурацию для учёта товара. Пока она достаточно простая, есть документ поступления и реализация товара.
Описание:
_Заполняем в документе реализации все необходимые реквизиты и табличную часть. Убеждаемся, что на остатках есть необходимый товар для проведения документа. Проводим документ, видим что никаких ошибок не возникло. Пытаемся провести ещё раз. И вот тут уже сталкиваемся с тем, что система не даёт провести документ и говорит, что товара недостаточно
_
И так, приступим к разбору.
Данная ошибка может возникать в случае применения старой методики проведения, когда сначала выбираются остатки регистра, а затем формируются новые движения.
Есть несколько способов решения сложившейся ситуации:
- Использовать настройку документа в конфигураторе во вкладке движения «Удаление движений» в значение «Удалять автоматически»
- Перейти на новую методику проведения. Тогда перед контролем остатков движения по текущему документу уже будут записаны в базу.
- Удалять движения документа программно перед считыванием остатков.
_Первые два варианта исправят положение, но не всегда применимы. А третий простой и действенный, для этого достаточно перенести часть кода в начало процедуры проведения и добавить строку с очисткой._
Надеюсь, данная информация будет кому-то полезна
В карусели добавил несколько скриншотов обозреваемый конфигурации и кода.
Данный пример несёт чисто ознакомительный характер.