При переносе данных между различными конфигурациями 1С специалисты часто сталкиваются со скрытыми особенностями поведения систем. Одной из классических проблем является перенос документов (например, документов поступления или реализации) из сторонних баз, таких как «1С:Управление торговлей 10.2» (УТ), в базовую версию «1С:Бухгалтерия 8.3» (БП). При попытке провести загруженные документы программа выдает критические ошибки:
«Для организации на [Период] не заполнена учетная политика»
«Для организации на [Период] не задана система налогообложения»
При этом, если создать точно такой же документ вручную в той же самой информационной базе, указав аналогичные реквизиты (контрагента, склад, номенклатуру, сумму и дату), он проводится абсолютно корректно и без каких-либо предупреждений. В этой статье мы подробно разберем, почему возникает такое расхождение, проанализируем внутренние механизмы платформы 1С и конфигурации «Бухгалтерия предприятия», а также предоставим пошаговые инструкции по исправлению этой ошибки как в уже загруженных данных, так и на уровне правил обмена «Конвертации данных 2.1».
Для того чтобы понять природу этой ошибки, проанализируем архитектуру базовой версии конфигурации «1С:Бухгалтерия 8.3». Ключевое ограничение базовой версии заключается в том, что в одной информационной базе разрешено вести учет только по одной-единственной организации. Разработчики фирмы 1С оптимизировали интерфейс под это ограничение:
Организации присутствует только один элемент, система автоматически скрывает поле Организация на формах всех документов и отчетов.Организация ссылкой на ту самую единственную организацию, которая создана в справочнике. Происходит это при создании нового объекта на сервере.Битые ссылки или ПустаяСсылка).Поскольку поле скрыто на форме, визуально документ кажется полностью заполненным и ничем не отличается от созданного вручную. Однако при попытке проведения система обращается к механизмам проверки учетной политики и налогообложения, передавая туда пустую ссылку вместо конкретной организации.
Рассмотрим подробнее программный код, который отвечает за проверку учетной политики в модуле конфигурации. Обратим внимание на функцию Существует в общем модуле УчетнаяПолитика:
Функция Существует(Организация, Период, ВыводитьСообщениеОбОтсутствииУчетнойПолитики = Ложь, ДокументСсылка = Неопределено) Экспорт
СпособОценкиТоваровВРознице = ПолучитьФункциональнуюОпцию("СпособОценкиТоваровВРознице",
Новый Структура("Организация, Период", Организация, НачалоМесяца(Период)));
УчетнаяПолитикаСуществует = НЕ (СпособОценкиТоваровВРознице = Ложь);
Если НЕ УчетнаяПолитикаСуществует И ВыводитьСообщениеОбОтсутствииУчетнойПолитики = Истина Тогда
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Для организации %1 на %2 не заполнена учетная политика.'"),
Организация,
Формат(НачалоМесяца(Период), "ДФ='MMMM yyyy'"));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ДокументСсылка, , "Объект");
КонецЕсли;
СистемаНалогообложения = ПолучитьФункциональнуюОпцию("СистемаНалогообложения",
Новый Структура("Организация, Период", Организация, НачалоМесяца(Период)));
НалоговыеНастройкиСуществуют = НЕ (СистемаНалогообложения = Ложь);
Если НЕ НалоговыеНастройкиСуществуют И ВыводитьСообщениеОбОтсутствииУчетнойПолитики = Истина Тогда
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Для организации %1 на %2 не задана система налогообложения.'"),
Организация,
Формат(НачалоМесяца(Период), "ДФ='MMMM yyyy'"));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ДокументСсылка, , "Объект");
КонецЕсли;
Возврат УчетнаяПолитикаСуществует И НалоговыеНастройкиСуществуют;
КонецФункции
Проанализируем эту ситуацию. Метод ПолучитьFunctionalOption (ПолучитьФункциональнуюОпцию) обращается к параметрам функциональных опций, передавая туда структуру, содержащую ключи Организация и Период. Когда в качестве параметра Организация передается пустая ссылка (или значение, не соответствующее ни одной реальной организации из базы данных), система не находит действующих записей в регистрах сведений учетной политики и налоговых настроек. В результате функции возвращают значение Ложь, срабатывают условия вывода сообщений об ошибках, и проведение документа блокируется.
Для детальной диагностики различий между работающим и неработающим документами высокоэффективно использовать специализированные инструменты отладки, например, «Инструменты разработчика» (ИР). Сравнивая два объекта базы данных — перенесенный и созданный вручную, — мы сразу увидим незаполненное значение в поле Организация у проблемного документа.
Если перенос данных уже осуществлен, и вам нужно срочно провести документы, нет необходимости переносить их заново. Мы можем воспользоваться встроенным в конфигурацию инструментом для группового изменения данных. Разберем по шагам, как это сделать:
ГрупповоеИзменениеРеквизитов).Поступление (акты, накладные, УПД) или Реализация (акты, накладные, УПД).Проведен со значением Равно Ложь и, при необходимости, ограничьте выборку датой или диапазоном дат.Чтобы избежать повторения этой ситуации при последующих загрузках данных, необходимо внести изменения в правила обмена данными (XML-правила), созданные в специализированной конфигурации «Конвертация данных 2.1». Разберем два варианта настройки.
Часто проблема кроется в том, что в правилах конвертации объектов (ПКО) для справочника Организации настроен поиск только по внутреннему идентификатору (GUID). Поскольку в базе-источнике (УТ 10.2) и базе-приемнике (БП 8.3) организации создавались независимо, их уникальные идентификаторы не совпадают. Система при загрузке документа пытается найти организацию по старому GUID, не находит её, в результате чего реквизит документа очищается или заполняется «битой» ссылкой.
Для исправления этого поведения выполните следующие настройки в «Конвертации данных 2.1»:
Организации.ИНН и КПП установите флаг Поиск.Если вы хотите гарантировать стопроцентное заполнение организации в документах-приемниках (независимо от того, как сопоставляются справочники организаций), лучшим решением будет написание небольшого программного алгоритма в обработчиках событий «Конвертации данных».
Мы можем использовать событие ПриЗагрузке или ПередЗагрузкой на уровне ПКО соответствующих документов. Проанализируем пример кода, который выполняет поиск единственной организации в базе-приемнике и жестко подставляет её в документ, если поле осталось незаполненным:
Если НЕ ЗначениеЗаполнено(Объект.Организация) Тогда
// Инициализируем выборку справочника Организации
ВыборкаОрганизаций = Справочники.Организации.Выбрать();
// Получаем первый (и единственный в базовой версии) элемент
Если ВыборкаОрганизаций.Следующий() Тогда
Объект.Организация = ВыборкаОрганизаций.Ссылка;
КонецЕсли;
КонецЕсли;
Этот простой и лаконичный код решает проблему раз и навсегда. Даже если из базы-источника пришла пустая ссылка или объект организации не смог сопоставиться, при загрузке документа в базу-приемник система самостоятельно найдет ту организацию, которая создана в вашей базовой «1С:Бухгалтерии», и запишет ее в реквизиты документа перед его сохранением в базу данных.
Используя предложенные методы, мы легко можем обойти интерфейсные ограничения базовой версии 1С, быстро восстановить работоспособность документов и автоматизировать корректный импорт данных в будущем.