Часто при программном создании документов в современных конфигурациях 1С (таких как 1С:ERP, Комплексная автоматизация 2 или Управление торговлей 11) разработчики сталкиваются с необычным поведением системы. Проанализируем следующую ситуацию: мы программно создаем документ ПриобретениеТоваровУслуг, корректно заполняем реквизит Контрагент (при проверке через отладчик ИНН и КПП на месте), записываем объект. Однако, когда мы открываем этот документ в пользовательском режиме, значение реквизита подменяется. Система отображает незаписанный элемент справочника с пустыми ИНН/КПП и совершенно другим кодом.
Давайте разберем по шагам, почему конфигурация ведет себя таким образом, и выясним причину, по которой система подставляет новый элемент справочника.
Посмотрим на пример кода, который приводит к подобной ситуации:
&НаКлиенте
Процедура Загрузить(Команда)
Перем СсылкаНаДокумент;
МояПроцедура(СсылкаНаДокумент);
ОткрытьЗначение(СсылкаНаДокумент);
КонецПроцедуры
&НаСервере
Процедура МояПроцедура(ТекДок)
СпрКонтр = Справочники.Контрагенты;
Д2 = Число(Сред("31.12.2023", 1, 2));
М2 = Число(Сред("31.12.2023", 4, 2));
Г2 = Число(Сред("31.12.2023", 7, 4));
НомерДокДляПоиска = "0000-000006";
ДокДляПоиска = Документы.ПриобретениеТоваровУслуг;
ТекДок = ДокДляПоиска.НайтиПоНомеру(НомерДокДляПоиска, НачалоДня(Дата(Г2,М2,Д2)));
Ссылка = СпрКонтр.НайтиПоНаименованию("Супер Бабилон Санкт-Петербург ООО");
Если ТекДок.Контрагент = Ссылка Тогда
к=1;
КонецЕсли;
КонецПроцедуры
В данном примере документ ищется на сервере, проверяется его реквизит, а затем на клиенте вызывается метод ОткрытьЗначение. Проблема кроется не в самом процессе записи (если она была), а в механизмах, которые срабатывают в момент открытия формы документа.
В конфигурациях УТ 11, ERP и КА 2 реализовано независимое (или зависимое, в зависимости от настроек) ведение партнеров и контрагентов. Документ требует заполнения обоих реквизитов: Партнер (управленческий учет) и Контрагент (регламентированный учет).
Разберем подробнее алгоритм проверки. Если при программном создании документа мы указали Партнера и Контрагента, которые не связаны друг с другом (Контрагент не подчинен данному Партнеру в базе), форма документа при открытии обнаружит конфликт. Логика формы попытается "исправить" несоответствие: она очистит неверного контрагента или попытается создать нового (временного, незаписанного) на основании данных указанного партнера. Именно поэтому появляется новый код и пустые поля ИНН/КПП.
Проанализируем ситуацию глубже. При открытии формы документа запускается процедура инициализации (например, ПриЧтенииНаСервере или связанные с ней обработчики пересчета данных). Форма проверяет корректность заполнения всей цепочки взаиморасчетов:
Если программный код заполнил только контрагента, но оставил пустым обязательное Соглашение, или указал договор, который принадлежит другой организации, алгоритмы формы инициируют перезаполнение. Срабатывает конструктор заполнения по умолчанию, который, ориентируясь на Партнера, генерирует нового Контрагента "на лету".
Если в документе выбран партнер с типом "Частное лицо", а контрагент подставлен с типом "Юридическое лицо", типовая конфигурация посчитает это ошибкой. При открытии сработает механизм синхронизации данных, который попытается создать объект правильного типа.
Рассмотрим практические шаги для исправления данной ошибки:
Партнер в документе заполнен и что программно подставляемый Контрагент действительно имеет этого партнера в качестве владельца в справочнике.ПриСозданииНаСервере или ПриЧтенииНаСервере. Пройдите код по шагам (F11) и найдите вызов типовой процедуры (например, ПроверитьОбновитьКонтрагента), которая перетирает ваши данные. Это покажет, какого именно условия не хватает для успешного прохождения проверки.Резюмируя: программное создание документов в современных системах требует не только записи нужных реквизитов, но и строгого соблюдения бизнес-логики и связей между объектами нормативно-справочной информации. Только в этом случае типовые формы будут открываться корректно без попыток "исправить" ваши данные.