Довольно часто при работе с конфигурацией 1С:Бухгалтерия предприятия 3.0 мы сталкиваемся с ситуацией, когда предопределенный счет (например, счет 68.16) отчетливо виден в режиме Конфигуратора, однако полностью отсутствует в режиме Предприятия. Разберем эту проблему детально, выясним причину такого поведения системы и рассмотрим все возможные варианты решения — от простых пользовательских настроек до написания собственных программных обработок.
Для начала проанализируем, как вообще устроены предопределенные элементы в современных версиях платформы. В новых релизах платформы 1С:Предприятие 8.3 архитектура предопределенных данных была существенно переработана. Теперь они разделены на две независимые сущности:
Связь между этими двумя сущностями больше не является жесткой (по внутреннему идентификатору). Платформа связывает их гибко через специальный системный реквизит ИмяПредопределенныхДанных. Если счет заведен в Конфигураторе, но мы не видим его в Предприятии, это означает, что физический элемент либо не был автоматически сгенерирован при реструктуризации базы (обновлении конфигурации), либо программная связь была каким-то образом разорвана (например, при неосторожном использовании универсальных обработок изменения реквизитов).
Посмотрим на практический пример со счетом 68.16. В типовой конфигурации 1С:Бухгалтерия 3.0 данный счет имеет четкое назначение: он используется для учета расчетов по "Налогу на профессиональный доход" (НПД). Данный функционал тесно связан с учетом операций с самозанятыми гражданами и переходом на систему Единого налогового платежа (ЕНП).
Как справедливо заметили пользователи на профильном форуме, в подавляющем большинстве случаев счет скрыт не из-за программной ошибки, а из-за выключенной опции. Рассмотрим подробнее, как вернуть его стандартными средствами без программирования.
Прежде чем приступать к написанию кода, проверим настройки самой конфигурации. План счетов в БП 3.0 является динамическим и гибко подстраивается под нужды конкретной организации. Разберем по шагам действия в пользовательском режиме:
Как только функциональная опция будет задействована, счет 68.16 автоматически появится в пользовательском режиме при выборе в документах.
Если настройки функциональности включены, но счет так и не появился, это свидетельствует о рассинхронизации метаданных и данных. Создадим внешнюю обработку для принудительного обновления. Разберем встроенный метод платформы, который заставляет систему перепроверить План счетов и досоздать недостающие элементы.
Напишем следующий код в процедуре выполнения нашей обработки:
&НаСервере
Процедура ОбновитьПредопределенныеСчетаНаСервере()
// Принудительно вызываем обновление предопределенных данных для хозрасчетного плана счетов
ПланыСчетов.Хозрасчетный.ОбновитьПредопределенныеДанные();
Сообщить("Предопределенные данные плана счетов успешно обновлены!");
КонецПроцедуры
Этот простой вызов заставит ядро платформы сопоставить элементы Конфигуратора и базы данных, после чего недостающий счет будет создан.
Проанализируем еще одну возможную ситуацию. Пользователь, не найдя счет 68.16, мог создать его руками в режиме Предприятия. Внешне счет выглядит правильно, но для системы он является обычным пользовательским счетом (а не предопределенным), из-за чего типовые алгоритмы проведения документов могут с ним не работать. Для замены ссылок с ошибочно созданного счета на корректный предопределенный во всех проводках и документах базы подойдёт обработка для поиска и замены значений во всей информационной базе.
Чтобы превратить пользовательский счет в системный (предопределенный), нам необходимо явно заполнить свойство ИмяПредопределенныхДанных. Разберем по шагам, как это запрограммировать:
Хозрасчетный.НалогНаПрофессиональныйДоход).
&НаСервере
Процедура ПривязатьСчетКМетаданнымНаСервере()
// Ищем счет по коду, который пользователь создал вручную
СсылкаНаСчет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("68.16");
Если ЗначениеЗаполнено(СсылкаНаСчет) Тогда
// Получаем объект для редактирования
СчетОбъект = СсылкаНаСчет.ПолучитьОбъект();
// Прописываем системное имя из конфигуратора
СчетОбъект.ИмяПредопределенныхДанных = "НалогНаПрофессиональныйДоход";
// Записываем изменения
Попытка
СчетОбъект.Записать();
Сообщить("Счет 68.16 успешно привязан к предопределенным данным!");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Счет с кодом 68.16 не найден в базе.");
КонецЕсли;
КонецПроцедуры
Рассмотрим дополнительные причины, из-за которых предопределенные данные могут не обновляться.
Распределенная информационная база (РИБ): Если проблема наблюдается в периферийном (подчиненном) узле РИБ, вам не нужно писать код. Предопределенные элементы в подчиненных узлах больше не создаются автоматически ядром при обновлении конфигурации. Они мигрируют как обычные данные справочников. Следовательно, вам нужно дождаться пакета обмена из центральной базы, где этот счет уже появился.
Сбои настроек платформы: Иногда для конфигурации установлен нестандартный режим обновления предопределенных данных (значение отлично от "Авто"). Эту проблему можно решить системными утилитами. Запустим Конфигуратор из командной строки с ключом /SetPredefinedDataUpdate -Auto. Это вернет платформе право автоматически генерировать недостающие элементы при реструктуризации.
Также не забывайте о стандартном средстве — утилите "Тестирование и исправление информационной базы". В ней есть отдельный пункт проверки целостности логической структуры, который отлично справляется с восстановлением нарушенных связей у предопределенных элементов.