При разработке и модификации конфигураций на платформе 1С:Предприятие 7.7 (например, популярной в свое время «Торговля и Склад 9.2») разработчики часто сталкиваются с неочевидным поведением метаданных. Типичный сценарий: вы копируете существующий документ или создаете новый, пытаетесь добавить в него локальный реквизит (например, Фирма), но система выдает ошибку: «Имя не уникально».
При этом при детальном осмотре структуры документа в Конфигураторе оказывается, что ни в шапке, ни в табличной части реквизита с таким идентификатором нет. Более того, при открытии формы этого документа данный реквизит присутствует на ней визуально и доступен для выбора в диалоге размещения элементов. В файле словаря метаданных 1CV7.DD для этого документа соответствующее поле также отсутствует.
В этой статье мы подробно разберем, почему возникает эта аномалия, как устроен механизм общих реквизитов в 1С 7.7, где они физически хранятся в базе данных и как правильно решить возникшую проблему.
Главная причина описанного поведения кроется в использовании механизма общих реквизитов документов. В платформе 1С 7.7 пространство имен реквизитов каждого конкретного документа является единым. Оно включает в себя не только локальные реквизиты (которые создаются непосредственно внутри самого документа), но и общие реквизиты, заданные на уровне всей ветки метаданных «Документы».
Общие реквизиты предназначены для сквозного ведения учета по ключевым разрезам (таким как Фирма, Автор, Проект) во множестве различных документов конфигурации. Вместо того чтобы создавать одинаковые реквизиты в каждом документе вручную, разработчик создает один общий реквизит и указывает, в каких именно документах он должен использоваться.
В типовой конфигурации «Торговля и Склад 7.7» (ТиС) реквизит Фирма как раз является общим. Он назначен для использования практически во всех документах системы, за редким исключением (например, документа «Сторно»).
Проанализируем детально процесс, который приводит к возникновению ошибки уникальности имени:
Фирма.Фирма в Конфигураторе автоматически устанавливается флаг («галочка») использования для нашего нового (скопированного) документа.Фирма в шапку или табличную часть этого документа, платформа обнаруживает конфликт имен. Так как имя Фирма уже занято унаследованным общим реквизитом, система сообщает: «Имя не уникально».Многих разработчиков сбивает с толку тот факт, что при анализе структуры таблиц конкретного документа в файле словаря данных 1CV7.DD (или 1CV7.DDS для SQL-версии) они не находят поля Фирма в таблице шапки документа (которая имеет физическое имя вида DH*). Давайте разберем этот важный технический нюанс.
Физическое размещение данных общего реквизита в СУБД (будь то файлы DBF или таблицы MS SQL Server) напрямую зависит от настроек свойств этого реквизита в Конфигураторе:
DH*, а записываются в общую таблицу заголовков журналов документов — 1SJOURN. Каждому такому общему реквизиту соответствует определенная колонка в таблице журнала (например, с именем SP<ID_реквизита>). Именно так настроен общий реквизит Фирма в ТиС. Именно поэтому в файле словаря данных 1CV7.DD в описании полей конкретного документа этого реквизита нет — физически колонка находится в таблице общего журнала.DH*), для которых этот реквизит назначен.Рассмотрим по шагам два возможных пути решения проблемы в зависимости от того, нужен ли нам этот реквизит в новом документе.
В этом случае вам не нужно создавать его заново. Он уже присутствует в вашем документе благодаря механизму наследования общих реквизитов. Вы можете сразу использовать его:
Фирма из списка доступных реквизитов шапки, чтобы разместить его визуальное представление на форме.
// Пример заполнения реквизита при вводе на основании или по умолчанию
Процедура ВводНового(Копирование)
Если Копирование = 0 Тогда
// Устанавливаем фирму по умолчанию
Фирма = глВыбратьФирмуПоУмолчанию();
КонецЕсли;
КонецПроцедуры
Если специфика вашего документа не предполагает работу с фирмами, и вы хотите полностью освободить это имя (например, чтобы создать собственный локальный реквизит с таким именем или просто очистить форму), вам необходимо отключить связь документа с общим реквизитом:
Фирма и дважды кликните по нему, чтобы открыть окно его свойств.После выполнения этих действий связь будет разорвана. Ошибка «Имя не уникально» исчезнет, реквизит пропадет из диалогов выбора для этого документа, и вы сможете беспрепятственно создать локальный реквизит с именем Фирма (если это потребуется) или продолжить работу без него.
Для общего понимания картины разберем, как платформа взаимодействует с общими реквизитами на программном уровне. В кодовой базе 1С 7.7 обращение к общим реквизитам практически не отличается от работы с обычными реквизитами документов:
// Прямая запись значения в общий реквизит документа
ДокСсылка.Фирма = ВыбраннаяФирма;
ДокСсылка.Записать();
// Проверим наличие общего реквизита программно
КоличествоОбщихРеквизитов = Метаданные.ОбщийРеквизитДокумента();
Для Номер = 1 По КоличествоОбщихРеквизитов Цикл
ИмяРеквизита = Метаданные.ОбщийРеквизитДокумента(Номер).Идентификатор;
Сообщить("Найден общий реквизит: " + ИмяРеквизита);
КонецЦикла;
Используя этот синтаксис, вы всегда сможете гибко анализировать структуру метаданных вашей информационной базы программным путем, что особенно полезно при написании универсальных обработок выгрузки или заполнения документов.