При создании новых документов в конфигурации 1С:Бухгалтерия 3.0 на управляемых формах разработчики часто сталкиваются со специфическими ошибками: блокировкой вызова модальных окон, незаполненными ценами номенклатуры или неоптимальной работой алгоритмов при отборе данных. Рассмотрим подробнее, как корректно реализовать заполнение табличной части документа определенной группой контрагентов, избавиться от устаревших конструкций языка 1С и правильно обработать получение цен.
Начиная с современных версий платформы 1С:Предприятие 8.3, в режиме интерфейса «Такси» и управляемого приложения по умолчанию включен запрет использования модальных окон. Использование синхронной функции Вопрос() приводит к сбою выполнения кода на клиенте.
Разберем, почему возникает эта ошибка: функция Вопрос() останавливает поток выполнения кода до тех пор, пока пользователь не сделает выбор. В тонком клиенте и веб-клиенте такой подход считается устаревшим и блокирует работу. Для диалога с пользователем необходимо применять неблокирующие асинхронные методы платформы.
Для корректного предупреждения пользователя необходимо заменить стандартный Вопрос на асинхронную процедуру ПоказатьВопрос с использованием объекта ОписаниеОповещения.
Критически важно учитывать: метод ПоказатьВопрос не останавливает выполнение исходной процедуры. Код, который должен выполниться после согласия пользователя (например, вызов серверной процедуры заполнения), должен располагаться строго внутри процедуры-обработчика оповещения.
Рассмотрим пример правильного оформления клиентского кода:
&НаКлиенте
Процедура Заполнить(Команда)
Если ЭтотОбъект.Объект.Проведен Тогда
Оповещение = Новый ОписаниеОповещения("ЗаполнитьПослеОтветаНаВопрос", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Нет);
Иначе
ЗаполнитьНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ЗаполнитьНаСервере();
КонецЕсли;
КонецПроцедуры
Проанализируем серверную часть заполнения. Частой ошибкой является использование прямого обхода справочника через метод Справочники.Контрагенты.Выбрать() в цикле Пока ВыборкаКонтр.Следующий(). Такой подход создает неэффективную нагрузку на сервер базы данных и усложняет фильтрацию по иерархии групп.
Для выборки элементов конкретной группы контрагентов следует использовать механизм Запросов. Использование языка запросов 1С дает следующие преимущества:
В ИЕРАРХИИ (&Группа).ДоговорыКонтрагентов и регистрами цен за один запрос к базе данных.Если в табличную часть номенклатура добавляется, но реквизиты суммы и цены остаются равными нулю при вызове функции Ценообразование.ПолучитьЦенуНоменклатуры(), проанализируем основные причины возникновения такой ситуации:
Объект.ТипЦен из шапки документа приведет к тому, что цена по договору не будет найдена. В этом случае нужно запрашивать ТипЦен из конкретного договора студента.Подводя итог, для качественной разработки механизмов заполнения документов в 1С:Бухгалтерии 3.0 необходимо соблюдать асинхронную модель работы интерфейса на клиенте, использовать запросы для выборки данных на сервере и строго контролировать источник получения типа цен номенклатуры.