1с получить длину кода справочника
Автонумерация
В данном разделе рассматриваются особенности работы механизма автонумерации на примере справочника.
Что такое автонумерация и зачем она нужна?
Автоматическая нумерация элементов справочников позволяет устанавливать во вновь создаваемых элементах уникальные коды. При этом создаваемые коды элементов последовательно увеличиваются.
Формирование нового уникального кода справочника зависит от того, как у справочника настроены серии кодов:
- во всем справочнике - в процессе формирования нового кода для элемента справочника будет сформирован код, уникальный во всем справочнике;
- в пределах подчинения - в процессе формирования нового кода для элемента справочника будет сформирован код, уникальный в пределах иерархии элемента (элементы, имеющие одного и того же родителя будут иметь различные коды, элементы, имеющие разных родителей могут иметь одинаковые коды);
- в пределах подчинения владельцу - в процессе формирования нового кода для элемента справочника будет сформирован код, уникальный в пределах подчинения (элементы, имеющие одного и того же владельца будут иметь различные коды; элементы, имеющие различных владельцев могут иметь одинаковые коды).
Последовательное увеличение кодов элементов справочника в процессе автонумерации будет происходить таким образом, чтобы создаваемый код справочника соответствовал настройке серии кодов.
Рассмотрим пример. Пусть есть справочник: иерархический, иерархия элементов, серии кодов - в пределах подчинения, автонумерация - включена.
Добавим в справочник первый элемент:
На рисунке видно, что автоматическая нумерация элементов справочника началась с 000001.
Добавим в справочник второй элемент:
Добавим в него еще один элемент, который будет дочерним для второго элемента:
На рисунке видно, что в процессе автоматического формирования кода для нового элемента справочника была учтена настройка серии кодов: код для третьего элемента уникален только в пределах элементов, родителем которых является второй элемент.
Одной из особенностей автонумерации является использование лидирующих нулей. Это необходимо для того, чтобы поиск и сортировка по коду (номеру) работали эффективно. Для этого используется индекс базы данных по полю код (или номер). Использование индекса требует упорядоченной последовательности с точки зрения базы данных. Поэтому 1С:Предприятие 8 в процессе автоматического формирования новых кодов (номеров) всегда использует лидирующие нули.
Обеспечить правильную сортировку, например, документов по их номеру без использования лидирующих нулей невозможно. Например, пусть у нас есть документы со строковыми номерами "Док11" и "Док3". В этом случае документ с номером "Док3" будет идти после документа с номером "Док11", что неправильно.
Работа с префиксом кода справочника в процессе автонумерации
Установка префикса при формировании нового номера кода элемента имеет смысл только в том случае, если код элемента является строкой.
Для того чтобы при формировании нового кода (номера) устанавливать префикс, можно воспользоваться обработчиком события При установке нового кода . Это событие возникает в тот момент, когда начинается формирование нового кода, например нового кода элемента справочника. Синтаксис описания этого обработчика следующий:
ПриУстановкеНовогоКода(<Стандартная обработка>, <Префикс>),
- <Стандартная обработка> - признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная генерация нового кода производиться не будет;
- <Префикс> - префикс, который будет использоваться для генерации кода.
Рассмотрим следующий пример. Пусть есть конфигурация для распределенной информационной базы, в которой с помощью префиксов обеспечивается формирование уникальных кодов справочников в каждом из узлов. Формирование такого уникального кода можно сделать так:
// Процедура обработчик события ПриУстановкеНовогоКода
// Подменяет префикс кода на предопределенный для данной ИБ
//
Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
КонецПроцедуры // ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
где "ПолучитьПрефиксНомера" - экспортируемая функция общего модуля, возвращающая значение некоторой константы. При этом значение константы для каждого из узлов должно быть свое:
// Выдает префикс нового номера
//
// Возвращаемое значение:
// Строка – Префикс нового номера
//
Функция ПолучитьПрефиксНомера() Экспорт
Наряду с использованием обработчика события При установке нового кода можно использовать метод объекта справочника УстановитьНовыйКод() . В параметре метода может быть передан нужный префикс - в этом случае среди кодов, имеющих данный префикс, будет найден максимальный, и новый код будет установлен как следующий от найденного максимального. Если префикс опущен - будет найден имеющийся максимальный код и новый код будет получен за счет увеличения правой числовой части найденного максимального. Нечисловая часть будет оставлена без изменений.
Следует учитывать, что если код элемента справочника является числом, префикс, возвращаемый из обработчика события При установке нового кода , использоваться не будет.
Поддержка автонумерации другими объектами метаданных
Кроме справочника, автонумерацию поддерживают следующие объекты метаданных:
- Документ;
- План видов характеристик;
- Бизнес-процесс;
- Задача.
Для документа, бизнес-процесса и задачи установку нового номера можно обработать в обработчике события При установке нового номера .
Для плана видов характеристик установку нового кода можно обработать в обработчике события При установке нового кода .
Мы уже познакомились с таким понятием, как объект в 1С , следующим шагом будет логично познакомиться с таким понятием, как ссылка в 1С.
Ссылка указывает на данные экземпляра объекта, но не хранит их, т.е. получив ссылку на конкретный экземпляр объекта, мы сможем узнать всю информацию об экземпляре этого объекта, но не сможем внести какие-нибудь коррективы в эту информацию.
Мы помним, что в платформе 1С 8.3. существуют три вида объектов. Это объекты метаданных, общие объекты и универсальные коллекции значений.
Так вот, ссылка может быть только у объектов метаданных.
Замечу что, ссылка указывает не на сам объект, а на экземпляр объекта. Хотя, очень часто употребляют выражения «ссылка объекта», «ссылка на объект» и т.п.
Все ссылки объектов имеют тип СправочникСсылка.<НазваниеОбъекта>, ДокументСсылка.<НазваниеОбъекта> и т.д.
Ссылку можно использовать в качестве переменной, и также ссылку можно указывать, как реквизит других объектов метаданных.
Например, в моей конфигурации есть справочник Контрагенты.
Это значит, теперь в документе Оплата можно хранить информацию о контрагенте, который сделал оплату.
Если мы используем ссылку в качестве реквизита какого-то объекта, то при редактировании экземпляра, на который указывает ссылка, сам реквизит не изменится.
Поясню на примере. Я выше создал документ Оплата и реквизит Оплативший для этого документа с типом СправочникСсылка.Контрагенты.
Если я переименую элемент справочника Контрагенты.
Затем, зайду обратно в выше созданный документ Оплата, то увижу, что отображение контрагента в реквизите поменялось автоматически.
Что это значит? Это не значит, что реквизит Оплативший элемента и сам элемент справочника Номенклатура поменялся автоматически. Нет, это значит, что данный реквизит хранит указатель на экземпляр объекта, который отображается посредством наименования. Поменяли наименование, поменялось только отображение, если бы поменяли какой-нибудь другой реквизит справочника Контрагенты, то пользователь бы ничего не заметил.
Получить ссылку 1С
Каким образом программно получить ссылку на экземпляр объекта, который уже есть в базе?
Сделать это можно несколькими способами: найти по коду, найти по наименованию, найти по реквизиту и найти по нескольким реквизитам через запрос. Я рассмотрю первые два метода.
Для демонстрации этих методов, на основной форме документа Оплата я создам команду «Установить контрагента», которую размещу в командной панели формы.
При выполнении этой команды я буду в поле Оплативший записывать определенного контрагента. Для этого я создам обработчики команды на клиенте и на сервере.
Первый способ получения ссылки: найти по коду, для поиска по коду необходимо использовать функцию менеджера объекта НайтиПоКоду.
Функция НайтиПоКоду вернёт ссылку на экземпляр объекта справочник Контрагенты, которому соответствует код 000000002. Почему мы задали код в виде строки, а не в виде цифры, например? Чтобы понять это, нужно открыть непосредственно редактор справочника Контрагенты в конфигураторе, перейти на закладку «Данные» и посмотреть, какой тип кода у этого справочника.
Таким образом, данный код:
Рассмотрим синтаксис этой функции для менеджера справочника:
НайтиПоКоду(<Код>,<ПоискПоПолномуКоду>,<Родитель>,<Владелец>)
Код – непосредственно тот код, по которому мы ищем наш элемент;
Данное поле необязательно, по умолчанию – Ложь;
Родитель – для иерархических справочников можно указать группу, тогда поиск будет вестись внутри группы. Данное поле необязательно;
Владелец – для подчиненных справочников можно указать владельца, тогда поиск будет вестись только среди элементов, подчиненных данному владельцу. Данное поле необязательно.
Второй способ получения ссылки: найти по наименованию, для поиска по наименованию необходимо использовать функцию менеджера объекта НайтиПоНаименованию.
Этот способ можно применить только для тех объектов, у которых имеется стандартный реквизит Наименование.
Например, у справочников этот реквизит имеется.
А у документов его нет.
В случае этой функции, поиск ведется по тому значению, которое в поле Наименование объекта
Синтаксис функции для менеджера справочника следующий:
НайтиПоНаименованию(<Наименование>,<ТочноеСоответствие>,<Родитель>,<Владелец>)
«Наименование» – непосредственно то наименование, по которому мы ищем наш элемент;
Данное поле необязательно, по умолчанию – Ложь.
Помните это, что по умолчанию поиск ведется не точно;
Параметры «Родитель» и «Владелец» точно такие же, как для процедуры НайтиПоКоду.
Пустая ссылка 1С
Выглядит он так:
ПустаяНоменклатура= Справочники.Номенклатура.ПустаяСсылка();
ПустаяОплата = Документы.Оплата.ПустаяСсылка();
Переменные ПустаяНоменклатура и ПустаяОплата содержат в себе пустые ссылки на каждый объект.
Обращаю Ваше внимание, что для каждого вида справочника и каждого документа будет своя собственная пустая ссылка.
Данный метод очень удобно использовать, когда нам необходимо знать, найден ли элемент справочника по коду (названию) или нет.
Метод Пустая() удобно использовать работая в клиентском контексте (в том числе на тонком клиенте), потому что менеджер объекта это «тяжелый» объекта и с ним можно работать только в серверном контексте. Т.е. установку контрагента можно сделать таким способом:
В этом коде я получаю по наименованию ссылку на нужного контрагента, делаю это в серверном методе, поскольку обращаюсь к менеджеру справочника, записываю если он не пустой, а потом в клиентском методе проверяю, найден контрагент по такому наименованию или нет, если не найден то вывожу предупреждение.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Использование кодов (номеров) объектов конфигурации
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
Методическая рекомендация (полезный совет)
Длины кодов (номеров) объектов конфигурации задаются в зависимости от их прикладного смысла.
-
Необходимость применения кодов (номеров) объектов конфигурации определяется из их прикладного смысла. Основания для применения кодов (номеров):
1.1. Пользователям предстоит работать со списками, содержащими большое количество элементов.
Пример: справочник Номенклатура .
1.2. Искать данные по коду (номеру) удобнее, чем по другим свойствам.
Например, справочник Статьи расходов . Пользователю проще запомнить код, чем каждый раз вчитываться в название статьи. Кроме того, названия статей могут меняться.
1.3. Код имеет прикладной смысл, продиктованный спецификой автоматизируемой области.
Например, код справочника Единицы измерения соответствует коду единицы измерения в ОКЕИ, код справочника Номера ГТД соответствует номеру грузовой таможенной декларации и т.д.
2.1. Код используется как краткое представление элемента данных в виде строки.
Например, для справочника Пользователи автонумерация не применяется, т.к. в коде хранится краткое имя пользователя (логин).
2.2. Код (номер) получается из внешних источников (т.н. входящие данные).
Например, это все классификаторы.
Другой пример - справочник Номера ГТД , код которого вводится исходя из данных входящих документов.
3.1. Для объектов с автонумерацией длина кода (номера) выбирается, исходя из потенциального количества всех объектов, хранимых в базе данных;
объектов, относящихся к определенному периоду (для документов и бизнес-процессов);
или объектов, относящихся к определенному владельцу (иерархические и подчиненные справочники, задачи).
При этом в длине номера необходимо учитывать длину префиксов нумерации, например, префикс информационной базы, префикс организации, если это предусмотрено конфигурацией и т.п.
При разработке типовых конфигураций рекомендуемыми, но не обязательными к применению являются длины кодов (номеров) из следующего ряда: 3, 5, 9, 11. При этом в длине номера необходимо учитывать длину префиксов нумерации, например, префикс информационной базы, префикс организации, если это предусмотрено конфигурацией и т.п.
Если в конфигурации используется подсистема Префиксация объектов из Библиотеки стандартных подсистем , то совокупную длину (с учетом префикса) номеров документов и кодов справочников рекомендуется устанавливать не менее 11 символов (11, 13, 15, …). Подробнее см. документацию к подсистеме "Префиксация объектов" на ИТС.
3.2. Для объектов, в которых код используется как краткое представление элемента данных в виде строки (см. п. 2.1) длина кода устанавливается достаточной для хранения краткого строкового представления объектов исходя из прикладного смысла кода.
3.3. Для объектов, в которых код (номер) получается из внешних источников (см. п. 2.2), длина кода (номера) зависит от этого источника.
3.4. Рекомендуется устанавливать допустимую длину кода (номера) объектов переменной.
В случае если прикладное решение рассчитано на работу с данными, которые могут вводиться параллельно из нескольких мест (в рамках РИБ, в других программах), в нем должна быть реализована возможность автоматической префиксации объектов конфигурации, для которых выполняются следующие условия:
- используется строковый код (номер),
- используется автонумерация,
- данные, соответствующие области, в пределах которой коды (номера) должны быть уникальными, могут вводиться параллельно из нескольких мест (узлов РИБ, программ) и впоследствии консолидироваться, например, в результате выполнения синхронизации данных. Пример такой области для большинства видов документов – организация и период.
При использовании в конфигурации Библиотеки стандартных подсистем реализовать данное требование позволяет подсистема Префиксация объектов .
В дереве метаданных справочники находятся в узле Справочники. При добавлении нового справочника открывается окно редактирования свойств справочника, в котором, переходя по закладкам можно заполнить основные свойства справочника:
Структура справочника
При создании нового справочника в базе данных автоматически создается таблица для хранения данных этого справочника. Если в справочнике нет ни одного реквизита, то в таблице будут колонки только для полей Код, Наименование, ПометкаУдаления, Ссылка и некоторых других служебных реквизитов. При этом если на закладке Данные указать длину кода или наименования равной нулю, то для них не будет создана колонка в таблице:
Если добавить в справочник несколько реквизитов:
То в таблицу базы данных автоматически будут добавлены две колонки: Артикул и Поставщик:
Ссылка | Наименование | Код | Артикул | Поставщик |
---|
Каждый элемент справочника хранится в отдельной строке (записи) таблицы. Например, если в пользовательском режиме добавить несколько элементов:
То таблица базы данных будет выглядеть следующим образом:
Ссылка | Наименование | Код | Артикул | Поставщик |
---|---|---|---|---|
8eae102c-86d5-11eb-80a3-e0d55e4e2669 | Клавиатура | 000000001 | Клав20 | Привезу все |
8eae102d-86d5-11eb-80a3-e0d55e4e2669 | Смартфон | 000000002 | См-30 | Привезу все |
Табличные части справочника
Табличная часть справочника хранится в отдельной таблице. В этой таблице есть колонки Ссылка и НомерСтроки, а также по одной колонке для каждого реквизита табличной части. Основная таблица справочника и табличная часть связаны между собой через поле Ссылка.
Если мы добавим в справочник табличную часть для хранения цен:
И для элемента Клавиатура заполним ее следующим образом:
То в базе данных будет создана следующая таблица:
Ссылка | Номер строки | Вид цены | Цена |
---|---|---|---|
8eae102c-86d5-11eb-80a3-e0d55e4e2669 | 1 | Оптовая | 500 |
8eae102c-86d5-11eb-80a3-e0d55e4e2669 | 2 | Розничная | 1000 |
В поле Ссылка хранится тот же самый идентификатор, что и в основной таблице справочника.
Иерархические справочники
Справочники могут быть иерархическими, то есть внутри одного элемента могут храниться другие элементы. Настройка иерархии выполняется на закладке Иерархия:
Если установить флаг Иерархический справочник, то в пользовательском режиме можно будет создавать как элементы, так и группы:
Элементы можно перетаскивать в группы, тогда они будут находиться внутри этой группы:
На уровне базы данных иерархия реализована через поля ЭтоГруппа и Родитель. В поле Родитель хранится ссылка на группу, в которой находится элемент (или группа, группы могут быть вложены друг в друга). Поле ЭтоГруппа имеет тип булево и в нем хранится признак группа это или элемент.
Для текущего состояния справочника таблица будет выглядеть следующим образом (для упрощения в поле Ссылка я буду отображать наименование элемента, а не идентификатор. Из реквизитов в таблице только код и наименование):
Ссылка | Наименование | Код | Это группа | Родитель |
---|---|---|---|---|
Смартфоны | Смартфоны | 000000004 | Да | |
Смартфон | Смартфон | 000000002 | Нет | Смартфоны |
Составляющие ПК | Составляющие ПК | 000000003 | Да | |
Клавиатура | Клавиатура | 000000001 | Нет | Составляющие ПК |
Для элементов или групп, которые находятся на верхнем уровне иерархии поле Родитель не заполнено.
Иерархия может быть двух видов:
- Иерархия групп и элементов
- Иерархия элементов
Пример иерархии групп и элементов можно увидеть выше. Это когда есть группы и есть элементы. Иерархия элементов выглядит следующим образом:
В этом случае нет разделения на группы и элементы. При этом элементы могут быть вложены друг в друга.
Флаг Размещать группы сверху определяет как будет выполняться сортировка. Если данный флаг установлен, то группы всегда будут выше элементов:
Если снять данный флажок, то сортировка будет выполняться независимо от признака ЭтоГруппа:
Также можно ограничить использование реквизитов. Для этого у каждого в реквизита в свойствах можно указать Использование:
Подчиненные справочники
Один справочник может быть подчинен другому справочнику. Например, есть справочник контрагентов и справочник договоров контрагентов. Чтобы в справочнике договоров не заводить отдельный реквизит для указания контрагента можно сделать его подчиненным справочнику контрагентов. В этом случае в таблице справочника будет добавлено поле Владелец, которое будет хранить ссылку на владельца.
Настройка подчиненности выполняется на закладке Владельцы в подчиненном справочнике:
Для добавления владельца нужно нажать на кнопку с зеленым карандашом и указать справочники-владельцы. Можно указать несколько справочников, тогда поле Владелец будет составного типа.
В поле Использование подчинения можно указать могут ли владельцами быть группы справочников или только элементы.
После настройки подчиненности, в пользовательском режиме у справочника-владельца вверху, в панели навигации формы появится ссылка для перехода в подчиненный справочник, причем автоматически будет выполнен отбор по владельцу:
Нумерация
Настройка нумерации справочников выполняется на закладке Нумерация:
Флаг Автонумерация позволяет автоматически заполнять поле Код при записи. Новый код будет на единицу больше предыдущего. Если данный флаг снят, то поле Код придется заполнять вручную. Как правило данный флаг оставляют включенным.
Флаг Контроль уникальности позволяет контролировать уникальность кодов справочника. Ниже можно указать в пределах чего контролировать уникальность:
Также на закладке Данные можно указать Длину кода и Тип кода. Тип может быть строковым или числовым:
Формы справочника
На закладке формы можно создать формы для справочника и указать некоторые из них как основные:
Читайте также: