При разработке сложных систем учета на платформе 1С:Предприятие часто возникает задача детализировать движения регистра накопления до конкретной строки документа или конкретной оказанной услуги. Стандартные средства платформы предлагают использовать измерения, однако тип данных УникальныйИдентификатор напрямую выбрать в качестве типа измерения регистра накопления невозможно. В этой статье мы подробно разберем, как обойти это ограничение, какие существуют альтернативы и как это повлияет на производительность вашей базы данных.
Самый очевидный способ, который часто выбирают разработчики, — это преобразование UUID в строку. Давайте рассмотрим, как это реализовать технически. Поскольку нам нужно хранить стандартный GUID, длина строки должна составлять 36 символов.
Для реализации этого метода выполним следующие шаги:
ИдентификаторУслуги.UUID строки и записывать его в регистр.Проанализируем пример кода для записи движения:
Движение = Движения.ОказанныеУслуги.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
// Преобразуем уникальный идентификатор строки ТЧ в строку 36 символов
Движение.ИдентификаторУслуги = Строка(СтрокаТЧ.КлючСвязиUUID);
Движение.Сумма = СтрокаТЧ.Сумма;
Важный нюанс: Помните, что УникальныйИдентификатор не является ссылочным типом. Если вы просто запишете Новый УникальныйИдентификатор(), вы получите уникальную последовательность, но потеряете связь с объектом, если он не сохранен в самой табличной части документа.
Давайте посмотрим на то, как эта задача решена в современных типовых решениях, таких как 1С:ERP 2.5 или УТ 11. Вместо тяжелых строковых идентификаторов разработчики фирмы "1С" используют числовой реквизит КлючСвязи. Это гораздо более эффективный метод с точки зрения производительности СУБД.
Рассмотрим алгоритм работы с ключом связи:
КлючСвязи (тип: Число).Этот подход позволяет избежать хранения 72 байт (в Unicode для строки 36 символов) на каждую запись регистра. Числовой идентификатор занимает значительно меньше места и обрабатывается SQL-сервером в разы быстрее.
Проанализируем ситуацию с точки зрения архитектуры базы данных. Регистр накопления — это не просто таблица записей, это механизм, который рассчитывает итоги. Использование уникального идентификатора в качестве измерения создает серьезную проблему — раздувание таблицы итогов.
Выясним причину: механизм итогов 1С работает эффективно только тогда, когда количество уникальных комбинаций измерений значительно меньше общего количества записей. Если у каждой записи будет свой уникальный UUID, то в таблице итогов на каждую запись движения будет создана своя запись итога. Это приведет к следующим последствиям:
UUID невозможна.Разберем по шагам, какой метод выбрать в зависимости от ваших задач:
КлючСвязи. Это стандарт де-факто в современной разработке на 1С. Он позволяет связать движение регистра с конкретной строкой ТЧ, не нагружая систему.СправочникСсылка). Ссылочные типы в 1С на уровне СУБД хранятся как binary(16), что гораздо компактнее и быстрее строки.Если структура вашего документа стабильна (строки не удаляются и не пересортировываются после проведения), можно использовать номер строки табличной части. Посмотрим на пример кода в модуле проведения:
Для Каждого ТекСтрока Из Товары Цикл
Движение = Движения.Запасы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрока.Номенклатура;
// Используем номер строки как ключ связи
Движение.НомерСтрокиДокумента = ТекСтрока.НомерСтроки;
Движение.Количество = ТекСтрока.Количество;
КонецЦикла;
Однако помните, что при интерактивной сортировке табличной части пользователем НомерСтроки может измениться. Чтобы избежать "битых" связей, рекомендуется записывать фиксированный идентификатор в реквизит строки при ее создании, как мы обсуждали во втором варианте.
Подведем итог: Технически использовать УникальныйИдентификатор как строку в измерении можно, но делать это стоит только в исключительных случаях, понимая риски замедления системы. В большинстве задач оптимальным решением будет использование числового ключа связи или ссылки на объект.