Почему в 1С:УТ 11.5 при программном создании реализации очищаются номера ГТД, указанные вручную?

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

При разработке обработок для загрузки данных часто возникает задача программного создания документа "Реализация товаров и услуг". Одна из распространенных проблем, с которой можно столкнуться, — это очистка номеров ГТД в табличной части "Виды запасов" при проведении документа. Даже если вы корректно заполнили все данные и установили флаг ВидыЗапасовУказаныВручную в значение Истина, при записи в режиме проведения номера ГТД могут бесследно исчезнуть. Проанализируем ситуацию и разберем по шагам, что может быть причиной и как это исправить.

Типичный сценарий выглядит так: в отладчике все данные на месте, но после выполнения метода Записать(РежимЗаписиДокумента.Проведение) таблица ВидыЗапасов оказывается перезаполненной, а номера ГТД — пустыми. Давайте выясним, почему так происходит.

Причина 1: Некорректное заполнение КлючаСвязи

Это самая частая причина проблемы. Табличные части "Товары" и "Виды запасов" в документе связаны между собой не по номеру строки, а через специальный реквизит — КлючСвязи. Если при программном добавлении строк вы не установили эту связь, то при записи документа система не сможет сопоставить, какие виды запасов (с ГТД) к какому товару относятся. В результате она сочтет ваши строки в "Видах запасов" "бесхозными", удалит их и запустит стандартный механизм автозаполнения.

Рассмотрим правильный алгоритм заполнения:

  1. Сначала создаем новую строку в табличной части Товары и заполняем ее.
  2. После добавления строки получаем ее уникальный идентификатор.
  3. Затем создаем строки в табличной части ВидыЗапасов, относящиеся к этому товару.
  4. В каждой новой строке ВидовЗапасов обязательно заполняем реквизит КлючСвязи полученным на втором шаге идентификатором.

Посмотрим на пример кода:


// Предполагаем, что ДокументОбъект - это создаваемый документ "РеализацияТоваровУслуг"

// Шаг 1: Добавляем строку в ТЧ "Товары"
НоваяСтрокаТоваров = ДокументОбъект.Товары.Добавить();
НоваяСтрокаТоваров.Номенклатура = СсылкаНаНоменклатуру;
НоваяСтрокаТоваров.КоличествоУпаковок = 10;
НоваяСтрокаТоваров.Цена = 100;
НоваяСтрокаТоваров.Сумма = 1000;
// ... заполняем остальные реквизиты строки товаров

// Шаг 2: Получаем идентификатор созданной строки
ИдентификаторСтрокиТовара = НоваяСтрокаТоваров.ПолучитьИдентификатор();

// Шаг 3 и 4: Добавляем строку в ТЧ "ВидыЗапасов" и устанавливаем связь
НоваяСтрокаВидыЗапасов = ДокументОбъект.ВидыЗапасов.Добавить();
НоваяСтрокаВидыЗапасов.АналитикаУчетаНоменклатуры.Номенклатура = СсылкаНаНоменклатуру;
// Заполняем ГТД
НоваяСтрокаВидыЗапасов.НомерГТД = СсылкаНаГТД; 
НоваяСтрокаВидыЗапасов.Количество = 10;
// Самый важный шаг - установка ключа связи
НоваяСтрокаВидыЗапасов.КлючСвязи = ИдентификаторСтрокиТовара;

// Не забываем установить флаг ручного заполнения
ДокументОбъект.ВидыЗапасовУказаныВручную = Истина;

Только при такой последовательности действий система корректно "поймет" ваши намерения и сохранит введенные данные.

Причина 2: Отсутствие остатков по указанному номеру ГТД

Даже при ручном указании видов запасов система при проведении выполняет проверки. Одна из них — это контроль наличия достаточного остатка товара на складе именно с тем номером ГТД, который вы указали. Если на остатках организации по данным учета нет нужного количества товара с конкретным номером ГТД, система может посчитать строку некорректной и очистить ее при попытке списания.

Что делать:

Причина 3: Ошибки в логике конфигурации или влияние расширений

В модуле документа РеализацияТоваровУслуг есть процедура ЗаполнитьВидыЗапасов, которая и отвечает за автоматическое распределение. Стандартная логика ее вызова в процедуре ПередЗаписью должна проверять флаг ВидыЗапасовУказаныВручную и не выполняться, если он установлен. Однако здесь могут быть нюансы.

Возможные проблемы:

  1. Баг в конкретной версии конфигурации. Как показывает практика, в некоторых релизах УТ 11 могли быть ошибки в логике вызова этой процедуры. Например, проверка на флаг ручного заполнения могла отсутствовать или работать некорректно.
  2. Конфликт с расширениями. Если в вашей базе установлено расширение, которое изменяет логику проведения документа реализации, оно может вызывать процедуру ЗаполнитьВидыЗапасов без учета флага ВидыЗапасовУказаныВручную.

Как диагностировать:

Лучший способ — это отладка. Установите точку останова в процедуре ПередЗаписью модуля объекта документа "РеализацияТоваровУслуг" и пошагово пройдите процесс записи в режиме проведения. Обратите особое внимание на условия, при которых вызывается процедура ЗаполнитьВидыЗапасов, и проанализируйте, почему игнорируется ваш флаг ручного ввода. Если вы обнаружили ошибку в коде конфигурации, исправлять ее лучше через расширение, чтобы не снимать конфигурацию с поддержки.

Причина 4: Неполные настройки номенклатуры

Наконец, убедитесь, что все базовые настройки для ведения учета по ГТД выполнены корректно. Иногда проблема кроется в самых очевидных вещах.

Проверьте следующие флаги в карточке номенклатуры:

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

← На главную