Почему в 1С 7.7 возникает ошибка «Имя не уникально» при создании реквизита документа и как ее исправить

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При разработке и модификации конфигураций на платформе 1С:Предприятие 7.7 (например, популярной в свое время «Торговля и Склад 9.2») разработчики часто сталкиваются с неочевидным поведением метаданных. Типичный сценарий: вы копируете существующий документ или создаете новый, пытаетесь добавить в него локальный реквизит (например, Фирма), но система выдает ошибку: «Имя не уникально».

При этом при детальном осмотре структуры документа в Конфигураторе оказывается, что ни в шапке, ни в табличной части реквизита с таким идентификатором нет. Более того, при открытии формы этого документа данный реквизит присутствует на ней визуально и доступен для выбора в диалоге размещения элементов. В файле словаря метаданных 1CV7.DD для этого документа соответствующее поле также отсутствует.

В этой статье мы подробно разберем, почему возникает эта аномалия, как устроен механизм общих реквизитов в 1С 7.7, где они физически хранятся в базе данных и как правильно решить возникшую проблему.

Выясняем причину: механизм работы общих реквизитов документов

Главная причина описанного поведения кроется в использовании механизма общих реквизитов документов. В платформе 1С 7.7 пространство имен реквизитов каждого конкретного документа является единым. Оно включает в себя не только локальные реквизиты (которые создаются непосредственно внутри самого документа), но и общие реквизиты, заданные на уровне всей ветки метаданных «Документы».

Общие реквизиты предназначены для сквозного ведения учета по ключевым разрезам (таким как Фирма, Автор, Проект) во множестве различных документов конфигурации. Вместо того чтобы создавать одинаковые реквизиты в каждом документе вручную, разработчик создает один общий реквизит и указывает, в каких именно документах он должен использоваться.

В типовой конфигурации «Торговля и Склад 7.7» (ТиС) реквизит Фирма как раз является общим. Он назначен для использования практически во всех документах системы, за редким исключением (например, документа «Сторно»).

Что происходит при копировании документа?

Проанализируем детально процесс, который приводит к возникновению ошибки уникальности имени:

  1. Мы копируем существующий документ-донор, в котором использовался общий реквизит Фирма.
  2. Платформа 1С 7.7 при копировании автоматически наследует для нового документа привязку к общему реквизиту. В свойствах общего реквизита Фирма в Конфигураторе автоматически устанавливается флаг («галочка») использования для нашего нового (скопированного) документа.
  3. Поскольку связь уже установлена, новый документ по умолчанию имеет доступ к этому реквизиту. Он отображается в диалоге выбора полей формы и доступен в программном коде.
  4. Когда мы пытаемся вручную добавить новый локальный реквизит с именем Фирма в шапку или табличную часть этого документа, платформа обнаруживает конфликт имен. Так как имя Фирма уже занято унаследованным общим реквизитом, система сообщает: «Имя не уникально».

Где физически хранятся общие реквизиты и почему их нет в файле 1CV7.DD для документа?

Многих разработчиков сбивает с толку тот факт, что при анализе структуры таблиц конкретного документа в файле словаря данных 1CV7.DD (или 1CV7.DDS для SQL-версии) они не находят поля Фирма в таблице шапки документа (которая имеет физическое имя вида DH*). Давайте разберем этот важный технический нюанс.

Физическое размещение данных общего реквизита в СУБД (будь то файлы DBF или таблицы MS SQL Server) напрямую зависит от настроек свойств этого реквизита в Конфигураторе:

Как решить проблему и управлять общими реквизитами в Конфигураторе

Рассмотрим по шагам два возможных пути решения проблемы в зависимости от того, нужен ли нам этот реквизит в новом документе.

Вариант 1. Если реквизит «Фирма» действительно нужен в документе

В этом случае вам не нужно создавать его заново. Он уже присутствует в вашем документе благодаря механизму наследования общих реквизитов. Вы можете сразу использовать его:

  1. Откройте форму скопированного документа в Конфигураторе.
  2. Используйте меню «Вставить» — «Реквизит» (или кнопку на панели инструментов) и выберите Фирма из списка доступных реквизитов шапки, чтобы разместить его визуальное представление на форме.
  3. В программном коде (модуле документа или формы) вы можете обращаться к нему напрямую, как и к любому другому реквизиту шапки:

// Пример заполнения реквизита при вводе на основании или по умолчанию
Процедура ВводНового(Копирование)
    Если Копирование = 0 Тогда
        // Устанавливаем фирму по умолчанию
        Фирма = глВыбратьФирмуПоУмолчанию();
    КонецЕсли;
КонецПроцедуры

Вариант 2. Если реквизит «Фирма» в новом документе не нужен

Если специфика вашего документа не предполагает работу с фирмами, и вы хотите полностью освободить это имя (например, чтобы создать собственный локальный реквизит с таким именем или просто очистить форму), вам необходимо отключить связь документа с общим реквизитом:

  1. Откройте Конфигуратор и перейдите в окно «Метаданные».
  2. Раскройте ветку «Документы», а затем найдите подветку «Общие реквизиты».
  3. Найдите в списке общий реквизит Фирма и дважды кликните по нему, чтобы открыть окно его свойств.
  4. В открывшемся окне свойств найдите и нажмите кнопку «Состав» (в некоторых релизах платформы она может называться «Определить...»).
  5. Перед вами откроется список всех документов вашей конфигурации. Найдите в этом списке ваш новый (скопированный) документ. Вы увидите, что напротив него установлена галочка.
  6. Снимите галочку напротив вашего документа и нажмите «ОК».
  7. Сохраните изменения в конфигурации.

После выполнения этих действий связь будет разорвана. Ошибка «Имя не уникально» исчезнет, реквизит пропадет из диалогов выбора для этого документа, и вы сможете беспрепятственно создать локальный реквизит с именем Фирма (если это потребуется) или продолжить работу без него.

Особенности работы с общими реквизитами в коде 1С 7.7

Для общего понимания картины разберем, как платформа взаимодействует с общими реквизитами на программном уровне. В кодовой базе 1С 7.7 обращение к общим реквизитам практически не отличается от работы с обычными реквизитами документов:


// Прямая запись значения в общий реквизит документа
ДокСсылка.Фирма = ВыбраннаяФирма;
ДокСсылка.Записать();

// Проверим наличие общего реквизита программно
КоличествоОбщихРеквизитов = Метаданные.ОбщийРеквизитДокумента();
Для Номер = 1 По КоличествоОбщихРеквизитов Цикл
    ИмяРеквизита = Метаданные.ОбщийРеквизитДокумента(Номер).Идентификатор;
    Сообщить("Найден общий реквизит: " + ИмяРеквизита);
КонецЦикла;

Используя этот синтаксис, вы всегда сможете гибко анализировать структуру метаданных вашей информационной базы программным путем, что особенно полезно при написании универсальных обработок выгрузки или заполнения документов.

← На главную