Как в 1с пронумеровать строки в
Все имеющиеся в 1С документы обязательно снабжаются специальными реквизитами - конкретнее, номером, временем и датой. Эти параметры гарантируют внутренние логику и порядок действия системы. Нумерация в системе автоматическая. Но может сбиваться, скажем, из-за неверных действий пользователей, меняющих номера "вручную". При отсутствии сторонних воздействий контроль за уникальностью номеров выполняется Нумератором документов.
Именно благодаря Нумератору нельзя создать документы с идентичными номерами. Когда документ сохраняется в журнале, то программа определяет ему следующий порядковый номер.
Ниже подробнее расписано, как действует Нумератор в виде объекта метаданных, определяющего порядок нумерации документов, в качестве примера приводится программа «1С:Бухгалтерия 3.0».
Документ, который мы хотим обработать, следует открыть в соответствующем варианте «Конфигуратор», далее через закладку «Нумерация» просмотреть нужные настройки. В частности, там есть галочка на автонумерацию, контроль для длины номера и уникальности и поле "Периодичность".
Каждую из установок следует изучить внимательнее.
Если установить галочку Автонумерации, то прямо при создании документ получит следующий по порядку номер. Номер останется уникальным в течение периода, отмеченного в соответствующем поле. Когда период обновится, то и нумеровка документов будет продолжаться по новой.
Показатель длины номера определяет, сколько может быть в символах эта максимальная длина.
Если стоит галочка на "контроле уникальности", то при сохранении документа программа будет согласно вышеописанному проверять номер на уникальность. Контроль выполняется в пределах периода из поля "Периодичность".
В поле "Периодичность" задаётся период, в течение которого номер гарантированно сохраняется уникальным. Обычно 1 год. Но можно задать четверть года, месяц или вообще один день. На практике результатом будет то, что при установке через месяц нумерация документов по прошествии месяца опять начнётся с первого номера.
Тип. Этой настройкой определяется, в каком виде формируется номер, т. е. в виде строки или числа. Скажем, если кроме цифры должны быть ещё разделяющие символы или буквы, отмечается "Строка".
Соответственно всем этим настройкам, когда документ сохраняется, то автоматически получает номер из 11 символов с временем проверки 1 год. Когда период обновится, то и нумерация тоже.
Главная функция нумератора - именно нумерование различных документов.
С его использованием можно пронумеровывать несколько их типов сразу. Это делается через дерево "Документы-Нумераторы".
Дабл-кликом мышки открывая "Нумератор", можно изучить на панели свойств характеристики. Такие же, как ранее рассматривались в свойствах нумерации документов.
Можно и создать собственный нумератор (через клавишу "Добавить" либо Ins) и назначить ему свойства.
После создания можно отметить новосозданный нумератор в настройках документа. Для тех документов, где он будет определён, будут применяться именно его свойства нумерации и в таких документах будет сквозная нумерация.
Например, так после выбора нумератора можно увидеть, что в свойствах документа параметры нумерации не задействованы.
Так, создав и отметив нумератор документов в свойствах, можно назначать различным группам документов различные способы их нумерации или, напротив, несколько разных видов документов нумеровать одинаково.
Для нумерации строк запроса необходимо воспользоваться встроенной функцией АВТОНОМЕРЗАПИСИ().
Её можно использовать только во временных таблицах. Более подробно можно посмотреть в справке. Всё просто. Ниже приведен небольшой пример:
Нужно выбрать все элементы справочника Тест и пронумеровать их. Создаем новое поле в запросе и забиваем в него функцию. Создаем временную таблицу и в последующей выборке получаем нужный результат.
В консоли запросов получился нужный нам результат
Специальные предложения
АВТОНОМЕРЗАПИСИ начинаеться не с 1, а с произвольного числа.
для АВТОНОМЕРЗАПИСИ гарантируеться только то, что следующее будет больше предыдущего. Не более echo77; kalyaka; khvolkova; tps_01; sasha777666; BigB; harmer; + 7 – Ответить (9) сделайте в одном запросе несколько временных таблиц
Сделайте в одной транзакции несколько запросов.
просто ради прикола выполните несколько раз подряд запрос
результат бывает и такой
Артикул Номер Номер1
31 31
32 32
33 33
34 34
00000005691 35 35
36 36
37 37
00000006383 38 38
39 39
40 40
ВЫБРАТЬ ПЕРВЫЕ 10
Номенклатура.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТабАртикулы.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер,
ТабАртикулы.Номер КАК Номер1
ПОМЕСТИТЬ ТабАртикулы2
ИЗ
ТабАртикулы КАК ТабАртикулы
;
Вы, конечно, не поверите, но ничего не меняется, выполняя ваш запрос N раз.
Допускаю, что при определенных условиях может возникать подобная ситуация, но я бы лучше перепроверил где-нибудь еще, чтобы исключить глюк системы.
Проверял на 8.3.13.1865
Вы, конечно, не поверите, но ничего не меняется, выполняя ваш запрос N раз.
Допускаю, что при определенных условиях может возникать подобная ситуация, но я бы лучше перепроверил где-нибудь еще, чтобы исключить глюк системы.
Могу предположить что дело в СУБД - попробуйте то же самое проделать на SQL Server
Функция предназначена для формирования поля с уникальным, последовательно возрастающим значением во временной таблице. Функцию можно использовать в том случае, если необходимо создать ключевое поле во временной таблице. Значение, сформированное этой функцией, будет уникально в пределах временной таблицы, при формировании которой использовалась функция. Начальное значение счетчика зависит от используемой СУБД и, в общем случае, может быть любым. Не гарантируется, что начальное значение счетчика будет равно 1 для любой временной таблицы.
Не поддерживается использование функции АВТОНОМЕРЗАПИСИ() в следующих случаях:
CratosX; echo77; KUAvanesov; dvissarov5; Cyberhawk; Mahon83; igee12; SergeRSA; aspirin4eg; sulfur17; Bassgood; + 11 – Ответить (24) не помогает. Иногда даже в одном запросе нумерация идет по возрастанию.(5)"АВТОНОМЕРЗАПИСИ() КАК ПорядковыйНомер"
.
УПОРЯДОЧИТЬ ПО
ПорядковыйНомер
(27)Вы ещё функцию вычисления хеш-ключа по набору полей пожелайте.
Ну и, до кучи - функцию генерации UUID.
Тут скорее полезность в том, что можно заранее вычислить временную таблицу с каким-то набором ключевых полей - и вот так в запросе её пронумеровать. А затем прилепить её к другим таблицам (по ключевым полям) и/или сделать из неё/них разные выборки (этот подход любят в типовом коде 1С) - а потом их соединять друг с другом - но уже не по ключевым полям - по вот такому полю-нумератору (мэппинг сложно-составного ключа к Числу - но надо делать заранее - и везде использовать готовый набор).
Конечно, прям вряд ли тут будет какой-то большой выигрыш в эффективности (производительности, нагрузки на память, легкочитаемости, хотя вот по модифицируемости - выигрыш может быть заметным), но для ряда очень сложных выборок, активно практикующих такие множественные соединения по одинаковым массивным ключам - может быть полезно!
Другое дело - что такая фишка открывает новые возможности, например с такой нумерацией гораздо проще написать алгоритмы устранения дублей, или сделать выборку, скажем, только чётных строк, или выбрать не только первые N, а наоборот, скажем, пропустить первые N записей, или выбрать, например из середины с M по N (правда с учётом, что нумерация может быть не с 0(1) а с произвольного числа такой код немного усложняется - но всё-таки не становится излишне запутанным!
Так же заметно упрощаются алгоритмы покадрового вычисления и вывода результатов запросов!
Вы ещё функцию вычисления хеш-ключа по набору полей пожелайте.Ну и, до кучи - функцию генерации UUID.
хеш мне пока был без надоности.. а вот почему к ID записей объектных таблиц нельзя обращаться в запросах?
насчет сортировки.. когда я комментил у меня была задача, когда надо было интеллектуально сопоставить множество заказов с множеством бонусов для этих заказов. Условно говоря у меня было 2 временных таблицы (сложным образом полученных). Сопоставляю все возможные сочетания записей между ними: нужно получить одну таблицу, в которой результат лучшего мэтчинга (например по минимуму скоринговой функции, вычисляемой по значениям некоторых полей обеих таблиц). Автонумерация (в каждой из сопоставляемых таблиц) здорово помогает, когда скоринговая функция (как бы ее не мудрить) принимает одинаковые значения для разных мэтчингов - тогда можно сделать такое расщепление- при прочих равных кто-то будет предпочтен, благодаря включению в эту функцию автономера. Но вот если бы этот номер был в свою очередь проставлен не произвольно, а в нужном порядке это бы улучшило результат )
Полагаю диалект MSSQL (хотя более глубокое знание SQL у меня еще впереди ))
В любом случае запросом такие штуки сложновато решать, т.к. не учитываются сложности взаимодействия между записями: каждая запись одной таблы мэтчится с записями другой независимо - а ведь выбор одной из возможностей изменяет множество доступной для сопоставления оставшимся.. Т.е. по хорошему такой выбор не сделать (предполагаю) реляционной алгеброй. (ну пришлось там пост обработкой запроса дотачивать).
(31)Вашу задачу из вашего описания понять очень сложно. Как я написал выше, атонумерацию как ключ сопоставления можно эффективно использовать - если эти ключи-номера рассчитаны единожды во временной таблице - и эта временна таблица далее либо соединяется (по полным ключам) к другим таблицам, либо из уже делаются все остальные выборкии подвыборким, которые далее уже соединяются между собой. Вот именно все дальнейшие соединения уже можно сделать но нумерованному ключу, но генерировать его нужно только в одной верхней выборке! (32) но если бы была возможность нумеровать не в произвольном порядке (ведь сейчас непредсказуемо какая запись получить меньший автономер а какая б о льший) то кроме уникальности записей появляется возможность их ранжировать (во временных таблицах), если такое ранжирование нужно. Кажется если сделать индексацию (по полям) то записи (в ВТ) будут пронумерованы в порядке этих индексов ) (33)Вот, честно, не могу понять, что за управляемую нумерацию Вы хотите. Автонумерация - это просто нумерация. Если Вы хотите управлять номером - конструкции "ВЫБОР", "ГДЕ", "ПЕРВЫЕ" и "УПОРЯДОЧИТЬ", а грегатные к Вашим услугам. Просто ранжирование - это применение некой функции-условия - вот её Вы должны написать сами. И не понимаю, как бы вы применяли "Автонумерацию", если бы она всегда начиналась с 0 (она и так автоупорялоченна согласно сортировки), кроме того что я уже выше написал - с единомоментной нумерацией, и а весь функционал дальше уже оформляется поствыборками! (34) неважно с нуля или не с нуля - я о том, чтобы сначала выстроить записи в определенном порядке (во временной таблице) и потом их в этом же порядке пронумеровать.неявным образом помогает индексировать. (35)Я вас не понимаю. Автонумерация во одной временной таблице идёт от N до M (где M > N) - без пропусков, в строгом порядке сортировки - в чём затык? (36)во временной таблице нет никакой сортировки. (в смысле оператор "упорядочить" отсутствует во временных таблицах.
Неявным образом применение индексирования упорядочивает записи (но это не гарантируется) и оператор Автономер - сработает _до_ индексирования. Т.е. нужно сначала ВТ индексировать, а потом в следующем запросе пакета из этой индексированной таблицы уже запросить и сделать автономер. (но опят же это все не гарантирует результат)
(37), Да "УПОРЯДОЧИТЬ ПО" нельзя применить во временной таблице без ключевого слова "ПЕРВЫЕ", но кто Вам мешает сделать вот так
Этот код у меня в базе (на MS SQL, PG, Oracle нет сейчас под рукой) отбирает только 10 записей - согласно условию отбора - и присваивает им номера от 1 до 10 согласно заданной сортировке по Коду
Нет в справочник добавлять никак нельзя. Во первых надо тогда его заполнять при всех добавлениях элементов в справочник.
Во вторых из справочника могут быть удалены элементы и вся нумерация рухнет.
А реквизит Код это просто многозначный уникальный код, а мне нужен номер строки в табличном поле.
(12) Что зачем? Зачем нумерацию или зачем общее кол-во?
На самом деле, нужно видеть сколько элементов имеется на данный момент в табличном поле. Визуальная нумерация, думаю, лучшее решение.
(16) ну ТОЛЬКО видимые посчитать достаточно легко, тебя это устроит?
Структура Таблица Значений имеет атрибут НомерСтроки
(18) прежде чем писать, неплохо было бы научиться читать
(16) и то, и то. Не могу представить, какая от этого практическая польза.
(22) Потому что справочник этот не в чистом смысле справочник. А некий перечень уникальных автомобилей (буфер). Нужно знать общее кол-во автомобилей.
(19) Т.е. я так понимаю стандартных решений (или полей/методов ака НомерСтроки/НомерПозиции) нет?
(24) нет ибо не имеет практического смысла.
можно посчитать записи, которые отображены на данным момент в ТП, но я не вижу в этом никакой пользы
Terv, ни тебе и даже мне пользы никакой нет. Но нашему главному менеджеру есть большая польза видеть кол-во автомобилей в квоте от дилера.
Ну надо это сделать.
+(22)
а у иерархического справочника с "развернутой" иерархией как должна выглядеть нумерация? а сортировки и отборы? - Порядковый номер элемента относительно чего?
"Видеть" количество элементов - более логичное пожелание.
Но все равно, как быть с отборами?
Оптимально: Запрос и результат в текстовое поле.
+ обновление данных этого поля по обработке оповещения
Три варианта:
1 - менеджеру по башке
2 - заменить справочник список на ТЗ
3 - (тупо) определить состояние отбора, и упорядочивания - сделать запрос, который даст в результате ТЗ "аналогичную" структуре представленного в ТП списка, выгрузить в ТЗ, при выводе строки искать в тз текущий элемент и выводить номер. перечитал - ЖЕСТЬ.
(27) Порядковый номер относительно номера строки в табличном поле (давайте отойдем от самого справочника).
Вне зависимости от отборов и фильтрации. Т.е. даже если отбор убрал половину записей, все оставшиеся записи должны быть пронумерованы относительно своего текущего (т.е. нового после отбора) положения в ТП.
Тут надо писать код в событии при выводе строки. Я так понимаю все строки выводятся заново при отборе/фильтрации?
(31) ну если хошь этот бред, то держи: (обновление нумерации вручную, добавь в ТП колонку "НомерОтображеннойСтроки")
(33) Спасибо! А разве ПриПолученииДанных не будет срабатывать при отборе/сортировке.
нельзя никак без ручной кнопки обойтись?
Нумерация строк в запросе
В тестовой конфигурации в журнале документов необходимо реализовать нумерацию строк в динамическом списке. В журнал входит три документа: "Заявка", "Приходный ордер" и "Расходный ордер". Первоначально форма списка журнала документов выглядит следующим образом:
В принципе, задача легко бы решалась, если список документов мы бы получали в отчете. Но тут дела обстоят иначе.
В отчетах - не проблема!
Создав отчет на системе компоновки данных с получением списка документов, задача решалась бы очень просто. В поля отчета нужно было бы всего-навсего добавить специальное поле "Номер по порядку".
В результате пользователь увидит подобный результат формирования отчета:
Но как быть, если нумерацию нужно получить непосредственно в запросе? Например, это может понадобиться для получения порядкового номера записи в динамическом списке.
Нумерация в запросе
Изменим запрос динамического списка журнала документов следующим образом:
При открытии динамического списка в режиме 1С:Предприятия получаем следующий результат:
Примечание: в примере показан лишь принцип нумерации строк непосредственно в запросе. Если Вы обратили внимание, то на скриншоте выше документы в списке, отсортированные по порядковому номеру строки, "идут" в порядке типов (сначала приходные ордера, затем расходные и т.д.). Это происходит, потому что, используя ссылку для соединения, мы не можем гарантировать, что GUID'ы ссылок будут уникальными. Также нельзя сравнивать ссылки разных типов документов - это приведет к некорректному результату. Можно использовать момент времени или другие поля, определяющие конкретное положение документа с общем списке журнала.
Конечно, используя подобный подход мы усложнили бы запрос к базе данных, плюс ко всему, некоторые возможности динамического списка, важные для работы пользователей, стали бы не доступными (динамическое считывание данных, основная таблица и т.д.), но пример был создан лишь для демонстрации возможности нумерации строк в запросах. Используя этот принцип для решения других задач, например для печатных форм, подобных проблем не возникнет.
Нужно понимать, что использование повторного обращения к таблице документа или журнала документов может отрицательно повлиять на производительность. Оптимальным было бы создание временной таблицы всех выбираемых документов, а затем уже работать с ней. Опять же, все зависит от конкретной задачи!
Читайте также: