Как исправить ошибки при программном заполнении документа и избавиться от модальных окон в 1С:Бухгалтерии 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При создании новых документов в конфигурации 1С:Бухгалтерия 3.0 на управляемых формах разработчики часто сталкиваются со специфическими ошибками: блокировкой вызова модальных окон, незаполненными ценами номенклатуры или неоптимальной работой алгоритмов при отборе данных. Рассмотрим подробнее, как корректно реализовать заполнение табличной части документа определенной группой контрагентов, избавиться от устаревших конструкций языка 1С и правильно обработать получение цен.

Причина ошибки «Использование модальных окон в данном режиме запрещено»

Начиная с современных версий платформы 1С:Предприятие 8.3, в режиме интерфейса «Такси» и управляемого приложения по умолчанию включен запрет использования модальных окон. Использование синхронной функции Вопрос() приводит к сбою выполнения кода на клиенте.

Разберем, почему возникает эта ошибка: функция Вопрос() останавливает поток выполнения кода до тех пор, пока пользователь не сделает выбор. В тонком клиенте и веб-клиенте такой подход считается устаревшим и блокирует работу. Для диалога с пользователем необходимо применять неблокирующие асинхронные методы платформы.

Переход на асинхронный метод ПоказатьВопрос

Для корректного предупреждения пользователя необходимо заменить стандартный Вопрос на асинхронную процедуру ПоказатьВопрос с использованием объекта ОписаниеОповещения.

Критически важно учитывать: метод ПоказатьВопрос не останавливает выполнение исходной процедуры. Код, который должен выполниться после согласия пользователя (например, вызов серверной процедуры заполнения), должен располагаться строго внутри процедуры-обработчика оповещения.

Рассмотрим пример правильного оформления клиентского кода:


&НаКлиенте
Процедура Заполнить(Команда)
    Если ЭтотОбъект.Объект.Проведен Тогда
        Оповещение = Новый ОписаниеОповещения("ЗаполнитьПослеОтветаНаВопрос", ЭтотОбъект);
        ПоказатьВопрос(Оповещение, "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Нет);
    Иначе
        ЗаполнитьНаСервере();
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        ЗаполнитьНаСервере();
    КонецЕсли;
КонецПроцедуры

Оптимизация выборки данных: почему следует отказаться от цикла Справочники.Контрагенты.Выбрать()

Проанализируем серверную часть заполнения. Частой ошибкой является использование прямого обхода справочника через метод Справочники.Контрагенты.Выбрать() в цикле Пока ВыборкаКонтр.Следующий(). Такой подход создает неэффективную нагрузку на сервер базы данных и усложняет фильтрацию по иерархии групп.

Для выборки элементов конкретной группы контрагентов следует использовать механизм Запросов. Использование языка запросов 1С дает следующие преимущества:

  1. Быстрый отбор контрагентов с учетом иерархии с помощью конструкции В ИЕРАРХИИ (&Группа).
  2. Исключение групп и помеченных на удаление элементов непосредственно на стороне СУБД.
  3. Возможность прямого соединения справочника контрагентов со справочником ДоговорыКонтрагентов и регистрами цен за один запрос к базе данных.

Почему при заполнении цен подставляются пустые (нулевые) значения?

Если в табличную часть номенклатура добавляется, но реквизиты суммы и цены остаются равными нулю при вызове функции Ценообразование.ПолучитьЦенуНоменклатуры(), проанализируем основные причины возникновения такой ситуации:

  1. Отсутствие проведенного документа «Установка цен номенклатуры»: если на дату документа (или более ранний период) не зафиксирована цена по переданному типу цен и номенклатуре, стандартный механизм ценообразования возвращает 0.
  2. Использование типа цен из шапки вместо типа цен договора: когда у контрагента заведено несколько договоров (например, «Обучение» и «Общежитие») и в каждом договоре определен свой индивидуальный тип цен, передача общего реквизита Объект.ТипЦен из шапки документа приведет к тому, что цена по договору не будет найдена. В этом случае нужно запрашивать ТипЦен из конкретного договора студента.
  3. Проверки дат и валют: дата документа должна быть не меньше даты установки цены, а валюта документа должна совпадать с валютой типа цен (или должен быть задан актуальный курс для пересчета).

Подводя итог, для качественной разработки механизмов заполнения документов в 1С:Бухгалтерии 3.0 необходимо соблюдать асинхронную модель работы интерфейса на клиенте, использовать запросы для выборки данных на сервере и строго контролировать источник получения типа цен номенклатуры.

← На главную