Разберем ситуацию, с которой часто сталкиваются разработчики при работе с конфигурациями на базе «1С:Предприятие 8.2» и «8.3» (особенно на обычных формах, таких как «Бухгалтерия предприятия 2.0»). Суть проблемы заключается в следующем: в конфигурации создана подписка на событие ПередЗаписью для документа (например, РасходныйКассовыйОрдер). В коде прописана логика заполнения определенных реквизитов, однако при интерактивном нажатии кнопки «Записать» в режиме «1С:Предприятие» значение реквизита не меняется, хотя отладчик показывает выполнение строки присвоения. При этом, что самое интересное, при автоматическом обмене данными тот же самый код отрабатывает безупречно.
Рассмотрим пример кода, который вызывает затруднения. Задача программиста — автоматически заполнить аналитику (Субконто) при совершении операции инкассации.
Процедура РКО_ДДСПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если ТипЗнч(Источник) = Тип("ДокументОбъект.РасходныйКассовыйОрдер") Тогда
Если Источник.ВидОперации = Перечисления.ВидыОперацийРКО.Инкассация Тогда
ДДСПоУмолчанию = Константы.ДДСПоУмолчанию.Получить();
Если Источник.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.ПереводыВПути Тогда
Источник.СубконтоДт1 = ДДСПоУмолчанию;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проблема проявляется странно: отладчик подтверждает, что ДДСПоУмолчанию содержит заполненную ссылку, типы Источник.СубконтоДт1 и ДДСПоУмолчанию совпадают, но после выполнения строки Источник.СубконтоДт1 = ДДСПоУмолчанию реквизит все равно остается пустым (ПустаяСсылка). Выясним, почему это происходит и как решить данную проблему.
Как показывает практика и обсуждение на форуме, наиболее частой причиной «необъяснимого» поведения платформы 1С является локальный кэш конфигурации. Платформа кэширует структуру объектов, типы данных и правила типизации для ускорения работы. Если в конфигурацию вносились изменения (например, менялся состав типов в Плане видов характеристик или добавлялись новые объекты), кэш на конкретном рабочем месте может «забаговать».
Почему это влияет на запись? Если локальный кэш считает, что реквизит СубконтоДт1 (имеющий составной тип) не может принимать тип СправочникСсылка.СтатьиДвиженияДенежныхСредств, платформа просто блокирует присвоение значения на уровне ядра, не выдавая при этом ошибку. При обмене данными (через COM-соединение или внешнюю обработку) часто создается новый сеанс или используются другие механизмы обращения, где кэш может отсутствовать или быть обновленным, поэтому там код работает.
Как исправить:
Очистите кэш пользователя. Самый простой и эффективный способ для файловых и серверных баз — удалить базу из списка в стартере 1С и добавить её заново. Также можно вручную удалить содержимое папок в каталогах %AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8.
Проанализируем порядок выполнения событий при записи документа. Важно помнить, что подписки на событие ПередЗаписью выполняются после выполнения процедуры ПередЗаписью в модуле самого объекта документа.
В типовых решениях (БП 2.0, УПП) документы имеют сложную внутреннюю логику. Рассмотрим, что может произойти:
ПередЗаписью в модуле документа РасходныйКассовыйОрдер.ВидаОперации.Почему код часто работает при обмене, но не работает вручную? Ответ кроется в свойстве ОбменДанными.Загрузка.
При выполнении обмена этот флаг устанавливается в значение Истина. В типовых конфигурациях почти весь код в модулях объектов (проверки, автозаполнения, очистки связанных регистров) обернут в условие:
Если Не ОбменДанными.Загрузка Тогда
// Здесь происходит автоматическое заполнение субконто, которое может затирать данные
КонецЕсли;
При ручной записи флаг Загрузка равен Ложь, и типовой код начинает активно «помогать» пользователю, очищая реквизиты, которые он считает лишними для данного счета или операции. Проанализируйте, нет ли в модуле документа кода, который принудительно очищает СубконтоДт1, если он не соответствует выбранному счету учета.
Реквизиты субконто обычно имеют тип Характеристика.ВидыСубконтоХозрасчетные. Это составной тип данных. В некоторых случаях простого присвоения ссылки недостаточно, если метаданные «Вида субконто» для конкретного счета не предполагают использование данного типа справочника.
Выясним причину через проверку доступных типов. Если счет ПереводыВПути в Плане счетов не имеет привязанного вида субконто «Статьи движения денежных средств», то платформа может очищать это поле при попытке записи документа, так как оно не соответствует правилам ведения учета, заданным в метаданных.
Рекомендация: Проверьте в режиме «1С:Предприятие», позволяет ли данный конкретный счет на форме документа выбрать статью ДДС вручную. Если нет — подписка тоже не сможет это сделать «законным» путем.
Если вы столкнулись с подобной ситуацией, рекомендуем придерживаться следующего плана действий:
Источник.Модифицированность(). Если после присвоения она Истина, а в базе данных значение все равно пустое — значит, затирание происходит позже (в событии ПриЗаписи или в других подписках).Таким образом, сочетание очистки технического «мусора» в виде кэша и внимательного анализа типовой логики объекта позволяет решить задачу программного заполнения реквизитов в подписках на события.