Ссылки в 1С:Предприятие — это один из ключевых механизмов работы с объектами базы данных. Они позволяют идентифицировать конкретные элементы справочников, документы, планы счетов и другие сущности без привязки к их физическому расположению. Понимание принципов работы со ссылками критично как для обычных пользователей (например, при заполнении документов), так и для разработчиков (при написании кода, интеграций или отчетов).
В этой статье мы разберем все аспекты работы со ссылками: от базовых понятий до продвинутых техник программирования. Вы узнаете, как создавать ссылки вручную и программно, какие бывают типы ссылок в 1С, как избежать типичных ошибок при их использовании, и даже как работать с ссылками через COM-соединение или REST API. Особое внимание уделим практическим примерам с кодом на встроенном языке 1С 8.3.
Если вы только начинаете осваивать 1С, не пугайтесь технических терминов — мы объясним всё простым языком. Опытные разработчики найдут здесь нюансы оптимизации кода и решения неочевидных проблем. А для тех, кто работает с 1С:ERP или 1С:УТ 11, приведём специфические примеры из этих конфигураций.
1. Что такое ссылка в 1С и зачем она нужна
Ссылка в 1С:Предприятие — это уникальный идентификатор объекта базы данных, который позволяет обращаться к нему независимо от его физического адреса. Представьте, что ссылка — это как почтовый индекс для письма: даже если дом перестроят или улицу переименуют, письмо всё равно дойдёт по правильному адресу.
Основные задачи ссылок:
- 🔗 Идентификация объектов: ссылка однозначно указывает на конкретный документ, элемент справочника или запись регистра.
- 🔄 Связывание данных: через ссылки организуются связи между объектами (например, документ "Реализация" ссылается на справочник "Контрагенты").
- 📊 Работа в коде: программное получение, изменение или удаление объектов по ссылке.
- 🔍 Поиск и фильтрация: ссылки используются в запросах и отборах.
Важно понимать, что ссылка — это не сам объект, а только указатель на него. Например, если вы получите ссылку на документ "Поступление товаров", а затем кто-то удалит этот документ, ссылка станет "битой" (недействительной). Это одна из самых распространённых ошибок при работе с ссылками.
⚠️ Внимание: В 1С 8.3 ссылки могут быть пустыми (значениеНеопределено) или указывать на несуществующие объекты. Всегда проверяйте ссылки перед использованием с помощью функцииЗначениеЗаполнено().
2. Типы ссылок в 1С: полные и неполные
В 1С:Предприятие существует два основных типа ссылок:
| Тип ссылки | Описание | Пример | Когда используется |
|---|---|---|---|
| Полная ссылка | Содержит уникальный идентификатор (UID) объекта и информацию о базе данных. Работает даже при переносе между базами. | СправочникСсылка.Контрагенты.абвгд1234567890 |
Обмен данными между базами, интеграции, хранение во внешних системах. |
| Неполная ссылка | Содержит только идентификатор объекта внутри текущей базы. Не работает при переносе в другую базу. | СправочникСсылка.Контрагенты.ООО_Ромашка |
Внутренние операции в одной базе, быстрые выборки. |
| Внешняя ссылка | Ссылка на объект в другой базе данных (используется в распределённых информационных базах). | ВнешняяСсылка.УзелОбмена1.Справочник.Номенклатура.абвгд098765 |
Обмен данными в РИБ (распределённых информационных базах). |
| Ссылка на значение | Ссылка на элемент перечисления, план видов характеристик и т.п. | ПеречислениеСсылка.ВидыНоменклатуры.Услуга |
Работа с перечислениями, виды субконто. |
В большинстве случаев вы будете работать с неполными ссылками, так как они проще в использовании и не требуют дополнительных проверок. Однако при обмене данными между базами или интеграции с внешними системами без полных ссылок не обойтись.
Критическая особенность: В конфигурациях на управляемых формах (например, 1С:ERP) при программном создании объектов часто возвращаются неполные ссылки, даже если вы ожидаете полные. Это может приводить к ошибкам при обмене данными.
3. Как получить ссылку на объект в 1С
Есть несколько способов получить ссылку на объект в 1С:
3.1. Получение ссылки в пользовательском режиме
В интерфейсе 1С:Предприятие ссылки отображаются автоматически в полях выбора. Например, когда вы выбираете контрагента в документе "Реализация товаров", в поле попадает ссылка на элемент справочника "Контрагенты".
Чтобы скопировать ссылку вручную:
- Откройте нужный объект (например, элемент справочника).
- Нажмите
Ещё → Скопировать ссылку(в некоторых конфигурациях пункт может называться по-другому). - Вставьте ссылку в нужное место (например, в код или в поле другого документа).
3.2. Программное получение ссылки
В коде на встроенном языке ссылки получают с помощью методов Ссылка или ПолучитьСсылку(). Примеры:
// Получение ссылки на текущий документ
ТекущийДокумент = Документы.ПоступлениеТоваровУслуг.ТекущийДокумент();
СсылкаНаДокумент = ТекущийДокумент.Ссылка;
// Получение ссылки на элемент справочника по наименованию
СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка").Ссылка;
// Получение ссылки на новый (ещё не записанный) объект
НовыйДокумент = Документы.ЗаказПокупателя.СоздатьДокумент();
СсылкаНаНовыйДокумент = НовыйДокумент.Ссылка; // Будет пустой, пока документ не записан
Обратите внимание: если объект не найден (например, контрагента с таким именем нет), метод НайтиПоНаименованию() вернёт Неопределено, и попытка получить .Ссылка приведёт к ошибке.
Чтобы избежать ошибок при поиске объектов, всегда используйте конструкцию Если ЗначениеЗаполнено(Объект) Тогда ... перед работой со ссылкой.
3.3. Получение ссылки через запрос
В языке запросов 1С ссылки возвращаются автоматически при выборке объектов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК СсылкаНаНоменклатуру
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &СсылкаНаДокумент";
Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаДокументПоступления);
Результат = Запрос.Выполнить();
В результате выполнения запроса вы получите таблицу со ссылками на номенклатуру из указанного документа.
4. Как создать объект по ссылке
Если у вас есть ссылка на объект, вы можете получить сам объект для дальнейшей работы с ним. Это делается с помощью метода ПолучитьОбъект().
// Получение объекта документа по ссылке
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Получение объекта справочника по ссылке
ЭлементСправочника = СсылкаНаКонтрагента.ПолучитьОбъект();
Важные нюансы:
- 🔓 Метод
ПолучитьОбъект()работает только для существующих объектов. Если объект удалён, будет ошибка. - 📝 Для изменения объекта после получения по ссылке его нужно заблокировать (для документов) или начать редактирование (для справочников).
- 🔄 Если объект уже изменён другим пользователем, может возникнуть конфликт блокировок.
Пример безопасного получения и изменения объекта:
Попытка
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.Заблокировать();
ДокументОбъект.Дата = ТекущаяДата();
ДокументОбъект.Записать();
Исключение
Сообщить("Ошибка при работе с документом: " + ОписаниеОшибки());
КонецПопытки;
⚠️ Внимание: В 1С:ERP 2.5 и 1С:УТ 11.5 при работе с документами через ссылки может срабатывать механизм версионирования. Если документ был изменён после получения ссылки, его придётся получать заново.
☑️ Безопасная работа со ссылками
5. Распространённые ошибки при работе со ссылками и как их избежать
Ошибки со ссылками — одна из самых частых причин падений в 1С. Разберём типичные проблемы и их решения.
5.1. Ошибка "Объект не найден"
Возникает, когда вы пытаетесь получить объект по ссылке, но сам объект уже удалён или ссылка битая.
Решение: всегда проверяйте ссылку перед использованием:
Если НЕ ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Сообщить("Ссылка пустая!");
ИначеЕсли НЕ СсылкаНаОбъект.Пустая() И НЕ СсылкаНаОбъект.ЭтоГруппа() Тогда
Попытка
Объект = СсылкаНаОбъект.ПолучитьОбъект();
Исключение
Сообщить("Объект по ссылке не найден: " + СсылкаНаОбъект);
КонецПопытки;
КонецЕсли;
5.2. Ошибка блокировки объекта
Если объект уже заблокирован другим пользователем, попытка получить его по ссылке приведёт к ошибке.
Решение: используйте Попытка...Исключение и повторные попытки с задержкой:
Попытка
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.Заблокировать(Истина, 10); // Ждём 10 секунд
Исключение
Сообщить("Не удалось заблокировать документ. Попробуйте позже.");
КонецПопытки;
5.3. Ошибки при обмене данными
При обмене между базами полные ссылки могут "ломаться", если не настроен правильный механизм синхронизации.
Решение: используйте планы обмена и методы ПолучитьСсылкуНовогоОбъекта():
НовыйОбъект = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НовыйОбъект.Записать();
НоваяСсылка = НовыйОбъект.ПолучитьСсылкуНовогоОбъекта(); // Для обмена
5.4. Ошибки с внешними ссылками
В распределённых базах внешние ссылки могут становиться неактуальными при изменении структуры узлов.
Решение: регулярно выполняйте синхронизацию метаданных и проверяйте актуальность ссылок.
Почему ссылки могут "исчезать" после обновления конфигурации?
При обновлении конфигурации 1С может изменять структуру метаданных, что приводит к недействительности старых ссылок. Например, если вы переименовали справочник или изменили его синоним, все ссылки на его элементы станут битыми. Чтобы избежать этого, используйте UID объектов (уникальные идентификаторы) вместо имён.
6. Продвинутые техники работы со ссылками
Для опытных разработчиков и администраторов 1С приведём несколько неочевидных приёмов работы со ссылками.
6.1. Работа с UID объекта
Каждая ссылка в 1С имеет уникальный идентификатор (UID), который можно использовать для надёжной идентификации объекта даже после переименования.
// Получение UID из ссылки
UID = СсылкаНаОбъект.УникальныйИдентификатор();
// Поиск объекта по UID
СсылкаПоUID = Метаданные.Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(UID));
6.2. Массовая обработка ссылок
Если нужно обработать большое количество ссылок (например, в регистре сведений), используйте пакетные операции:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(Ссылка1);
МассивСсылок.Добавить(Ссылка2);
// Получение объектов пакетом
МассивОбъектов = Справочники.Номенклатура.ПолучитьСписок(МассивСсылок);
6.3. Ссылки в REST API и COM-соединении
При интеграции с внешними системами ссылки передаются в специальном формате:
- 🌐 В REST API ссылки кодируются в
base64или передаются как строки с префиксом (например,"catalog:123e4567-e89b-12d3-a456-426614174000"). - 🖥️ В COM-соединении ссылки передаются как объекты
V83.COMConnector.
Пример работы со ссылкой через HTTP-сервисы:
URL = "http://server/hs/exchange/get_object?ref=" + Base64Строка(СсылкаНаОбъект.УникальныйИдентификатор());
Ответ = ПолучитьHTTPРесурс(URL);
6.4. Оптимизация запросов со ссылками
Если в запросе используются ссылки, их лучше передавать как параметры, а не подставлять напрямую в текст:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка В (&МассивСсылок)";
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылокНаДокументы);
Использование UID вместо имён объектов делает код более надёжным при обновлениях конфигурации, так как UID не изменяется при переименовании справочников или документов.
7. Примеры использования ссылок в типовых конфигурациях
Разберём специфические примеры работы со ссылками в популярных конфигурациях 1С.
7.1. 1С:Бухгалтерия 3.0
В бухгалтерии ссылки часто используются для связи документов с планами счетов:
// Получение счета по ссылке из документа
СчетДебет = ДокументОбъект.СчетаУчета.Получить(0).СчетБухгалтерскогоУчета.Ссылка;
// Поиск субконто по ссылке
Субконто = ПланыСчетов.Хозрасчетный.НайтиПоНаименованию("10.01").Субконто1.ПолучитьСсылку();
7.2. 1С:Управление торговлей 11
В УТ 11 ссылки активно используются в заказах, реализациях и резервировании:
// Получение остатков по ссылке на номенклатуру
Остатки = РегистрыНакопления.ОстаткиТоваров.Остатки(СсылкаНаНоменклатуру, , ТекущаяДата());
// Резервирование товара по ссылке
Движение = РегистрыНакопления.РезервыТоваров.СоздатьМенеджерЗаписи();
Движение.Товар = СсылкаНаНоменклатуру;
Движение.Количество = 10;
Движение.Записать();
7.3. 1С:ERP 2.5
В ERP ссылки используются для сложных междокументных связей, например, между заказами и производствами:
// Получение связей между документами
Связи = ДокументОбъект.ПолучитьСвязиПоТипу(Тип("ДокументСсылка.ЗаказНаПроизводство"));
// Создание связи между документами
НоваяСвязь = ДокументОбъект.СоздатьСвязь();
НоваяСвязь.Тип = Тип("ДокументСсылка.ЗаказПокупателя");
НоваяСвязь.Ссылка = СсылкаНаЗаказ;
НоваяСвязь.Записать();
7.4. 1С:Зарплата и управление персоналом 3.1
В ЗУП ссылки часто применяются для работы с физическими лицами и начислениями:
// Получение данных сотрудника по ссылке
ФизЛицо = СсылкаНаСотрудника.ФизическоеЛицо.ПолучитьОбъект();
ТабельныйНомер = ФизЛицо.ТабельныйНомер;
// Поиск начислений по ссылке на сотрудника
Начисления = РегистрыСведений.НачисленияСотрудников.ПолучитьПоследние(СсылкаНаСотрудника);
⚠️ Внимание: В ЗУП 3.1 при работе со ссылками на физических лиц учитывайте, что один человек может быть привязан к нескольким сотрудникам (например, если он работает в разных организациях). Всегда проверяйте актуальность связи между физическим лицом и сотрудником.
8. Как отладить проблемы со ссылками
Если в коде возникают ошибки, связанные со ссылками, используйте эти методы диагностики:
8.1. Проверка ссылки в отладчике
В режиме отладки (F5) посмотрите, что хранится в переменной со ссылкой:
- 🔍 Если значение
Неопределено— ссылка не была получена. - 🔗 Если ссылка есть, но объект не находится — возможно, он удалён.
- 📌 Если ссылка ведёт не на тот объект — проверьте логику получения.
8.2. Журнал регистрации
Включите журнал регистрации (Администрирование → Журнал регистрации) и отфильтруйте события по:
- 📝 Ошибки блокировки (если проблема с конкурентным доступом).
- 🗑️ Удаление объектов (если ссылки становятся битыми).
- 🔄 Обмен данными (если ошибки после синхронизации).
8.3. Тестовый код для проверки ссылок
Используйте этот шаблон для диагностики:
Процедура ПроверитьСсылку(Ссылка)
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
Сообщить("Ссылка пустая!");
Возврат;
КонецЕсли;
Сообщить("Тип ссылки: " + ТипЗнч(Ссылка));
Сообщить("UID: " + Ссылка.УникальныйИдентификатор());
Сообщить("Представление: " + Ссылка.Представление());
Попытка
Объект = Ссылка.ПолучитьОбъект();
Сообщить("Объект получен успешно: " + Объект.Ссылка);
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
8.4. Восстановление битых ссылок
Если в базе накопилось много битых ссылок, используйте обработку "Поиск и замена значений" (Все функции → Стандартные → Поиск и замена значений), чтобы:
- 🔍 Найти все пустые или некорректные ссылки.
- 🗑️ Удалить или заменить их на актуальные.
- 📊 Сгенерировать отчёт по проблемам.
Для автоматизации можно написать обработку, которая проходит по всем документам и проверяет ссылки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Документы.Ссылка КАК СсылкаНаДокумент,
| Документы.Контрагент КАК СсылкаНаКонтрагента
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документы
|ГДЕ
| НЕ Документы.Контрагент.ЭтоГруппа()
| И Документы.Контрагент.Ссылка.Пустая()";
Результат = Запрос.Выполнить();
Пока Результат.Следующий() Цикл
Сообщить("Битая ссылка в документе: " + Результат.СсылкаНаДокумент);
КонецЦикла;
FAQ: Ответы на частые вопросы о ссылках в 1С
🔹 Как скопировать ссылку на документ в буфер обмена?
Откройте документ, нажмите Ещё → Скопировать ссылку (в некоторых конфигурациях этот пункт может находиться в Действия → Дополнительно). Также можно использовать код:
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.ТекущийДокумент().Ссылка;
ТекстСсылки = СсылкаНаДокумент.УникальныйИдентификатор();
БуферОбмена.Значение = ТекстСсылки;
🔹 Почему при обмене данными ссылки становятся недействительными?
Это происходит из-за того, что в разных базах UID объектов не синхронизированы. Решения:
- Настройте план обмена с правильным сопоставлением объектов.
- Используйте метод
ПолучитьСсылкуНовогоОбъекта()при записи. - Проверьте, что в обеих базах включён режим
ИспользоватьУникальныеИдентификаторы.
🔹 Можно ли по ссылке определить, какой это объект (документ, справочник)?
Да, используйте функции ТипЗнч() или Метаданные().Тип():
ТипСсылки = ТипЗнч(СсылкаНаОбъект); // Вернёт, например, "ДокументСсылка.ПоступлениеТоваровУслуг"
ИмяМетаданных = СсылкаНаОбъект.Метаданные().Имя;
🔹 Как найти все документы, которые ссылаются на определённый справочник?
Используйте запрос с условием по ссылке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Документы.Ссылка КАК СсылкаНаДокумент
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документы
|ГДЕ
| Документы.Контрагент = &СсылкаНаКонтрагента";
Запрос.УстановитьПараметр("СсылкаНаКонтрагента", СсылкаНаКонтрагента);
Результат = Запрос.Выполнить();
🔹 Как сохранить ссылку во внешней системе и потом её восстановить?
Лучше сохранять UID объекта в текстовом виде, а при восстановлении искать объект по UID:
// Сохранение
UID = СсылкаНаОбъект.УникальныйИдентификатор();
ТекстДляСохранения = Base64Строка(UID);
// Восстановление
UID = Base64Значение(ТекстИзВнешнейСистемы);
СсылкаНаОбъект = Метаданные.Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(UID));