Как программно заполнить документ «Передача в торговый зал ЕГАИС» и сопоставить номенклатуру в 1С?

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

При разработке внешних обработок для интеграции с подсистемой ЕГАИС в конфигурациях «1С:Розница», «1С:Управление торговлей» или «1С:ERP» разработчики часто сталкиваются с двумя типовыми проблемами при переносе данных из документов остатков в документы перемещения:

  1. В документе-источнике (например, ОстаткиЕГАИС) присутствует только классификатор алкогольной продукции (реквизит АлкогольнаяПродукция), а в целевом документе (ПередачаВТорговыйЗалЕГАИС) требуются одновременно и Номенклатура учетной системы, и АлкогольнаяПродукция.
  2. При программном заполнении строк табличной части значение реквизита Количество не сохраняется или отображается пустым, хотя в отладчике значение успешно присваивается.

Разберем причины такого поведения платформы и построим корректный алгоритм создания и заполнения документа.

Причина 1: Связь классификатора ЕГАИС со справочником «Номенклатура»

В типовых конфигурациях 1С справочник Номенклатура и справочник КлассификаторАлкогольнойПродукцииЕГАИС напрямую не связаны через реквизиты. Их соответствие хранится в специальном регистре сведений — СоответствиеНоменклатурыЕГАИС.

Чтобы получить позицию номенклатуры учетной системы по элементу алкогольной продукции, необходимо выполнить левое соединение с этим регистром по полю АлкогольнаяПродукция.

Причина 2: Особенности учета количества и упаковок в типовых решениях

В табличных частях большинства товароучетных документов конфигурации «1С:Розница» отображаемое и рассчитываемое количество жестко завязано на реквизит КоличествоУпаковок. Если заполнять исключительно реквизит Количество, стандартные механизмы пересчета при записи объекта или при открытии формы пересчитывают его на основании пустых упаковок и коэффициентов, что приводит к обнулению данных.

Для корректного заполнения табличной части необходимо явно передавать значение в реквизит КоличествоУпаковок, либо заполнять оба реквизита одновременно.

Разбор типовых ошибок в алгоритме выборки

Проанализируем распространенную ошибку при работе с выборкой данных запроса:


Выборка = Запрос.Выполнить().Выбрать();
НовДок.Магазин = Выборка.Магазин; // Ошибка: позиционирование еще не выполнено
НовДок.Склад = Выборка.Склад;
Пока Выборка.Следующий() Цикл
    // Заполнение строк
КонецЦикла;

Объект ВыборкаИзРезультатаЗапроса до первого вызова метода Следующий() не указывает ни на одну запись. Обращение к полям шапки до цикла возвращает Неопределено. Для избежания подобных ошибок удобнее выгружать результат запроса в таблицу значений или разделять получение данных шапки и табличной части.

Пошаговый пример правильного заполнения документа

Рассмотрим готовый вариант кода обработки. Для упрощения сопоставления полей используем процедуру ЗаполнитьЗначенияСвойств, а данные связываем напрямую через регистр сведений СоответствиеНоменклатурыЕГАИС.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Остатки.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
    |	Остатки.Количество КАК Количество,
    |	Остатки.Количество КАК КоличествоУпаковок,
    |	Остатки.СправкаБ КАК СправкаБ,
    |	ЕСТЬNULL(Соответствие.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура
    |ИЗ
    |	Документ.ОстаткиЕГАИС.ОстаткиПоДаннымЕГАИС КАК Остатки
    |	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурыЕГАИС КАК Соответствие
    |		ПО Остатки.АлкогольнаяПродукция = Соответствие.АлкогольнаяПродукция
    |ГДЕ
    |	Остатки.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ДокументОстатки);
ТаблицаТоваров = Запрос.Выполнить().Выгрузить();

// Создаем новый документ перемещения
НовДок = Документы.ПередачаВТорговыйЗалЕГАИС.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
НовДок.ОрганизацияЕГАИС = ДокументОстатки.ОрганизацияЕГАИС;

// Заполняем строки табличной части
Для Каждого СтрДанных Из ТаблицаТоваров Цикл
    НовСтр = НовДок.Товары.Добавить();
    ЗаполнитьЗначенияСвойств(НовСтр, СтрДанных);
    
    // Если учет ведется без упаковок, обязательно инициализируем коэффициент
    Если НовСтр.Коэффициент = 0 Тогда
        НовСтр.Коэффициент = 1;
    КонецЕсли;
КонецЦикла;

// Записываем документ
НовДок.Записать(РежимЗаписиДокумента.Запись);

Важные методологические нюансы

  1. Ограничения по типам продукции: Документ ПередачаВТорговыйЗалЕГАИС (перемещение с Регистра №1 на Регистр №2) по методологии ЕГАИС применяется только для немаркируемой алкогольной продукции (пиво, сидр, медовуха). Маркированная продукция учитывается поштучно на Регистре №1 и Регистре №3, перемещение её в торговый зал запрещено регламентом ФСРАР.
  2. Дублирование сопоставлений: В регистре СоответствиеНоменклатурыЕГАИС одной позиции алкогольной продукции может соответствовать несколько связок с учетом характеристик или серий. При формировании запроса рекомендуется следить за уникальностью записей, чтобы избежать задвоения строк.
← На главную