Автоматическая нумерация в табличной части
Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
Всем привет!
Уже поднимал эту тему, потом бросил ей заниматься, сейчас вернулся снова.
1с; Документооборот, 8.2.
Есть документ "ПередачаДокументов", в котором есть табличная часть "СписокДокументов".
Реквизиты табличной части:
Документ - СправочникСсылка.ВнутренниеДокументы;
ТипЭкземпляра - Перечисление (Оригинал или копия);
НомерЭкземпляра - Число;
Получатель - СправочникСсылка.ФизическиеЛица.
Задача следующая: при записи документа автоматически расставить номера копий для каждого документа из табличной части. Номер должен быть уникальным. Вроде все просто, сделал так:
В модуле объекта
Не работает, выдает ошибку о неуникальности записи. В чем проблема? что не так?
Заранее благодарю, весь мозг сломал уже
Уже поднимал эту тему, потом бросил ей заниматься, сейчас вернулся снова.
1с; Документооборот, 8.2.
Есть документ "ПередачаДокументов", в котором есть табличная часть "СписокДокументов".
Реквизиты табличной части:
Документ - СправочникСсылка.ВнутренниеДокументы;
ТипЭкземпляра - Перечисление (Оригинал или копия);
НомерЭкземпляра - Число;
Получатель - СправочникСсылка.ФизическиеЛица.
Задача следующая: при записи документа автоматически расставить номера копий для каждого документа из табличной части. Номер должен быть уникальным. Вроде все просто, сделал так:
В модуле объекта
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Для Каждого Строка Из СписокДокументов Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
| ЖурналПередачиДокументов.Документ КАК Документ
|ИЗ
| РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
|ГДЕ
| ЖурналПередачиДокументов.Документ = &Документ
|
|СГРУППИРОВАТЬ ПО
| ЖурналПередачиДокументов.Документ";
Запрос.УстановитьПараметр("Документ", Строка.Документ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Результат.Пустой() Тогда
Строка.НомерЭкземпляра = 1;
Иначе
Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
ПоказатьНе работает, выдает ошибку о неуникальности записи. В чем проблема? что не так?
Заранее благодарю, весь мозг сломал уже
По теме из базы знаний
- Исправление нумерации документов в УПП
- Перенумерация (смена даты и времени) справочников и документов (обычные и управляемые формы)
- Доработка универсальной обработки загрузки данных из табличного документа (для возможности загрузки в документ "Перенос данных" (ЗУП 3.1))
- Как сделать сотрудникам детей
- Как читать чужой код? Часть 3. Разбор и доработка запросов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(12) Ягг,
Как раз после операции Выборка.Следующий()
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Для Каждого Строка Из СписокДокументов Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
| ЖурналПередачиДокументов.Документ КАК Документ
|ИЗ
| РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
|ГДЕ
| ЖурналПередачиДокументов.Документ = &Документ
|
|СГРУППИРОВАТЬ ПО
| ЖурналПередачиДокументов.Документ";
Запрос.УстановитьПараметр("Документ", Строка.Документ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Не Выборка.Следующий() Тогда
Строка.НомерЭкземпляра = 1;
Иначе
Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
ПоказатьКак раз после операции Выборка.Следующий()
(15) fatalist56, если поставить точку останова на строчку "Строка.НомерЭкземпляра = 1;" или любу выше "Если" то Выборка.ПоследнийНомер выдаст ошибку так как выборка еше не спозиционирована.
Вот если поставить точку останова в строку "Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;" тогда ошибки быть не должно. Но может конечно затесались английские бууквы и тогда написание в запросе отличается от написания в строке.
Вот если поставить точку останова в строку "Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;" тогда ошибки быть не должно. Но может конечно затесались английские бууквы и тогда написание в запросе отличается от написания в строке.
(19) shatshat, Да, измерением. Сделал не сам, был в типовой конфе.
Поставил где написали - все равно переменная не определена. Текст переписывал сто раз английские буквы затесаться не должны, тем более что Пунто стоит :)
Вот если поставить точку останова в строку "Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;" тогда ошибки быть не должно.
Поставил где написали - все равно переменная не определена. Текст переписывал сто раз английские буквы затесаться не должны, тем более что Пунто стоит :)
А где Выборка.Следующий()?
Если не ошибаюсь у тебя без этого Выборка.ПоследнийНомер все время равен NULL, в результате в строку записывается 0 (или 1 - надо в отладчике смотерть). Вот и повторения при проведении.
или нет?
Вобщем добавиь вместо Результат.Пустой() текст
.... Если Не выборка.Следующий() тогда...
Если не ошибаюсь у тебя без этого Выборка.ПоследнийНомер все время равен NULL, в результате в строку записывается 0 (или 1 - надо в отладчике смотерть). Вот и повторения при проведении.
или нет?
Вобщем добавиь вместо Результат.Пустой() текст
.... Если Не выборка.Следующий() тогда...
(10) shatshat, ЖурналПередачиДокументов - это и есть регистр. Заполняется он
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// регистр ЖурналПередачиДокументов
Движения.ЖурналПередачиДокументов.Записывать = Истина;
Для Каждого ТекСтрокаСписокДокументов Из СписокДокументов Цикл
Движение = Движения.ЖурналПередачиДокументов.Добавить();
Движение.Период = Дата;
Движение.Документ = ТекСтрокаСписокДокументов.Документ;
Движение.ТипЭкземпляра = ТекСтрокаСписокДокументов.ТипЭкземпляра;
Движение.НомерЭкземпляра = ТекСтрокаСписокДокументов.НомерЭкземпляра;
Движение.Пользователь = Пользователи.АвторизованныйПользователь();
Движение.Получатель = ТекСтрокаСписокДокументов.Получатель;
Движение.Комментарий = ТекСтрокаСписокДокументов.Комментарий;
КонецЦикла;
Показать
(17) fatalist56, тогда нужно сдалть отлкьную таблицу с максимальными значениями из регистров. а затем уже пробежаться по строкам документа, искать нужную строчку в табличке, и там ее наращивать.
Что-то вроде:
В звапросе убираем условие или меняем его на условие вхождение всех документов (что правильнее)
тНомера = Запрос.Выполнить.Выгрузить();
ДЛя каждой строкаТ из СписокДокумента цикл
СтрокаДанных = тНомера.Найти(СтрокаТ.Документ);
Если СтрокаДанных = неопределено тогда
СтрокаДанных = тНомера.Добавить();
СтрокаДанных.Документ = СтрокаТ.Документ;
КонецЕсли;
строкаТ.НомерЭкземпляра = 1+СтрокаДанных.ПоследнийНОмер;
СтрокаДанных.ПоследнийНОмер = строкаТ.НомерЭкземпляра;
КонецЦикла;
ТОлько видимо еще надо блокировки ставить, на случай паралельного провдения разных документов. Хотя пока можно на этом не заморачиваться.
В регистр должна уйти "схлопнтуая" информация, т.е. таблица тНОмера, так как в ней макисмальные номера харнятся
Что-то вроде:
В звапросе убираем условие или меняем его на условие вхождение всех документов (что правильнее)
тНомера = Запрос.Выполнить.Выгрузить();
ДЛя каждой строкаТ из СписокДокумента цикл
СтрокаДанных = тНомера.Найти(СтрокаТ.Документ);
Если СтрокаДанных = неопределено тогда
СтрокаДанных = тНомера.Добавить();
СтрокаДанных.Документ = СтрокаТ.Документ;
КонецЕсли;
строкаТ.НомерЭкземпляра = 1+СтрокаДанных.ПоследнийНОмер;
СтрокаДанных.ПоследнийНОмер = строкаТ.НомерЭкземпляра;
КонецЦикла;
ТОлько видимо еще надо блокировки ставить, на случай паралельного провдения разных документов. Хотя пока можно на этом не заморачиваться.
В регистр должна уйти "схлопнтуая" информация, т.е. таблица тНОмера, так как в ней макисмальные номера харнятся
"Все верно, только мне нужно если документ одинаковый то для второй записи он подставил следующий номер. Как это можно реализовать"
То есть у Вас в строках этого же документа ЕСТЬ дублирующиеся ВнутренниеДокументы?
Если в строке2 есть Документ7 и он же встречается в строке7 - ваш запрос в процедуре "ПередЗаписью" выдаст один и тот же НомерЭкземпляра ОБОИМ строкам
То есть у Вас в строках этого же документа ЕСТЬ дублирующиеся ВнутренниеДокументы?
Если в строке2 есть Документ7 и он же встречается в строке7 - ваш запрос в процедуре "ПередЗаписью" выдаст один и тот же НомерЭкземпляра ОБОИМ строкам
(23) fatalist56,
В момент выполнения процедуры ПередЗаписью() - регистр в этот момент никаким образом не меняется!!!
значит, при одинаковых параметрах запроса (в разных строках) даст один и тот же результат
(22) Ягг,
Модифицировать ПередЗаписью() с помощью объекта Соответствие.
Например так
В момент выполнения процедуры ПередЗаписью() - регистр в этот момент никаким образом не меняется!!!
значит, при одинаковых параметрах запроса (в разных строках) даст один и тот же результат
(22) Ягг,
Модифицировать ПередЗаписью() с помощью объекта Соответствие.
Например так
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
УпомянутыеДокументы = Новый Соответствие;
Для Каждого Строка Из СписокДокументов Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
| ЖурналПередачиДокументов.Документ КАК Документ
|ИЗ
| РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
|ГДЕ
| ЖурналПередачиДокументов.Документ = &Документ
|
|СГРУППИРОВАТЬ ПО
| ЖурналПередачиДокументов.Документ";
Запрос.УстановитьПараметр("Документ", Строка.Документ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Не Выборка.Следующий() Тогда
Строка.НомерЭкземпляра = 1;
Иначе
Если УпомянутыеДокументы[Строка.Документ]=неопределено Тогда
Прибавка=1; УпомянутыеДокументы[Строка.Документ]=1
Иначе
УпомянутыеДокументы[Строка.Документ]=УпомянутыеДокументы[Строка.Документ]+1;
Прибавка=УпомянутыеДокументы[Строка.Документ];
КонецЕсли;
Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + Прибавка;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
Показать
(30) fatalist56, Пока движение делается по каждой строке результат всегда будет один и тот-же. Нужно в движение давать сводную информацию - максимальных значений. Нужно обрботку проведения мучить. Там (через соотвесиве)
МаксНОмера = новый Соответсвие;
Для каждого СтрокаТ из СписокДокументов цикл
ТекНомер = Число( МаксНомер[СтрокаТ.Документ]); // по моему неопределено должно дать ноль - но надо проверить.
МаксНомер[СтрокаТ.Документ] = Макс(ТекНомер, СтрокаТ.НомерЭкземпляра);
КонецЦикла;
Для каждого Эл из МаксНОмера цикл
Движение = ..
Движение.Документ = Эл.Ключ;
Движение.НОмер = Эл.Значение;
КонецЦикла;
Кажется так
МаксНОмера = новый Соответсвие;
Для каждого СтрокаТ из СписокДокументов цикл
ТекНомер = Число( МаксНомер[СтрокаТ.Документ]); // по моему неопределено должно дать ноль - но надо проверить.
МаксНомер[СтрокаТ.Документ] = Макс(ТекНомер, СтрокаТ.НомерЭкземпляра);
КонецЦикла;
Для каждого Эл из МаксНОмера цикл
Движение = ..
Движение.Документ = Эл.Ключ;
Движение.НОмер = Эл.Значение;
КонецЦикла;
Кажется так
стоп! косяк ))) извините. при пустой выборке надо тоже это проделать
(23) fatalist56, пробуй, должно работать
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
УпомянутыеДокументы = Новый Соответствие;
Для Каждого Строка Из СписокДокументов Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
| ЖурналПередачиДокументов.Документ КАК Документ
|ИЗ
| РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
|ГДЕ
| ЖурналПередачиДокументов.Документ = &Документ
|
|СГРУППИРОВАТЬ ПО
| ЖурналПередачиДокументов.Документ";
Запрос.УстановитьПараметр("Документ", Строка.Документ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если УпомянутыеДокументы[Строка.Документ]=неопределено Тогда
Прибавка=1; УпомянутыеДокументы[Строка.Документ]=1
Иначе
УпомянутыеДокументы[Строка.Документ]=УпомянутыеДокументы[Строка.Документ]+1;
Прибавка=УпомянутыеДокументы[Строка.Документ];
КонецЕсли;
Если Не Выборка.Следующий() Тогда
Строка.НомерЭкземпляра = Прибавка;
Иначе
Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + Прибавка;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
Показать(23) fatalist56, пробуй, должно работать
попробуйте так:
Только поместить код в процедуру ПриЗаписи, когда ссылка уже имеется на документ.
Если Ссылка.Пустая() Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПередачаДокументовСписокДокументов.Документ,
| ПередачаДокументовСписокДокументов.НомерЭкземпляра,
| ПередачаДокументовСписокДокументов.НомерСтроки
|ПОМЕСТИТЬ ДанныеДокумента
|ИЗ
| Документ.ПередачаДокументов.Начисления КАК ПередачаДокументовСписокДокументов
|ГДЕ
| ПередачаДокументовСписокДокументов.Ссылка = &Ссылка
| И ДанныеДокумента.НомерЭкземпляра = 0
|;
|ВЫБРАТЬ
| МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
| ЖурналПередачиДокументов.Документ КАК Документ
|ПОМЕСТИТЬ ДанныеРегистра
|ИЗ
| РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
|ГДЕ
| ЖурналПередачиДокументов.Документ В (ВЫБРАТЬ ДанныеДокумента.Документ ИЗ ДанныеДокумента КАК ДанныеДокумента)
|СГРУППИРОВАТЬ ПО
| ЖурналПередачиДокументов.Документ
|;
|ВЫБРАТЬ
| ДанныеДокумента.Документ,
| ДанныеДокумента.НомерЭкземпляра,
| ДанныеДокумента.НомерСтроки,
| ЕСТЬNULL(ДанныеРегистра.ПоследнийНомер, 1) КАК ПоследнийНомер
|ИЗ
| ДанныеДокумента КАК ДанныеДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ ДанныеРегистра КАК ДанныеРегистра
| ПО ДанныеДокумента.Документ = ДанныеРегистра.Документ
|УПОРЯДОЧИТЬ ПО
| ДанныеДокумента.Документ
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.СледующийПоЗначениюПоля("Документ") Цикл
НачальныйНомер = Выборка.ПоследнийНомер;
Пока Выборка.СледующийПоЗначениюПоля("НомерСтроки") Цикл
СписокДокументов[Выборка.НомерСтроки - 1].НомерЭкземпляра = НачальныйНомер;
НачальныйНомер = НачальныйНомер + 1;
КонецЦикла;
КонецЦикла;
ПоказатьТолько поместить код в процедуру ПриЗаписи, когда ссылка уже имеется на документ.
ТОлько вот мне кажется что при этой реализации есть одна "мина" - если два документа паралельно начнут записываться (при многоаользовательском среверном варианте), то они получат из регистров одинаковые макимальные номера и непраивльно "подсчииаются". Т.е. произойдет наложение номеров.
(37) Ягг, согласен
но катастрофы случиться не должно - выскочит та самая ошибка, которую наблюдал автор в начале - транзакции проведений документов ведь цельны - то есть кто успеет а кто-то "обломится". Обломавшемуся придется увидеть ошибку и перезаписать/перепровести док
но катастрофы случиться не должно - выскочит та самая ошибка, которую наблюдал автор в начале - транзакции проведений документов ведь цельны - то есть кто успеет а кто-то "обломится". Обломавшемуся придется увидеть ошибку и перезаписать/перепровести док
(40) fatalist56,
уфалла )))
причина понятна - в запросе при подсчете максимальнного учитывается и номер, заданный прошлым проведением этого же документа
попробуй усугубить запрос условием "И ЖурналПередачиДокументов.Регистратор<>&ЭтотДокумент"
плюс
Запрос.УстановитьПараметр("ЭтотДокумент", Объект.Ссылка);
уфалла )))
причина понятна - в запросе при подсчете максимальнного учитывается и номер, заданный прошлым проведением этого же документа
попробуй усугубить запрос условием "И ЖурналПередачиДокументов.Регистратор<>&ЭтотДокумент"
плюс
Запрос.УстановитьПараметр("ЭтотДокумент", Объект.Ссылка);
(41) shatshat,
{Документ.ПередачаДокументов(38,46)}: Переменная не определена (Объект)
Запрос.УстановитьПараметр("ЭтотДокумент", <<?>>Объект.Ссылка); (Проверка: Сервер)
попробуй усугубить запрос условием "И ЖурналПередачиДокументов.Регистратор<>&ЭтотДокумент"
плюс
Запрос.УстановитьПараметр("ЭтотДокумент", Объект.Ссылка);
плюс
Запрос.УстановитьПараметр("ЭтотДокумент", Объект.Ссылка);
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
УпомянутыеДокументы = Новый Соответствие;
Для Каждого Строка Из СписокДокументов Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
| ЖурналПередачиДокументов.Документ КАК Документ
|ИЗ
| РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
|ГДЕ
| ЖурналПередачиДокументов.Документ = &Документ
|И ЖурналПередачиДокументов.Регистратор<>&ЭтотДокумент
|
|СГРУППИРОВАТЬ ПО
| ЖурналПередачиДокументов.Документ";
Запрос.УстановитьПараметр("Документ", Строка.Документ);
Запрос.УстановитьПараметр("ЭтотДокумент", Объект.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если УпомянутыеДокументы[Строка.Документ]=неопределено Тогда
Прибавка=1; УпомянутыеДокументы[Строка.Документ]=1
Иначе
УпомянутыеДокументы[Строка.Документ]=УпомянутыеДокументы[Строка.Документ]+1;
Прибавка=УпомянутыеДокументы[Строка.Документ];
КонецЕсли;
Если Не Выборка.Следующий() Тогда
Строка.НомерЭкземпляра = Прибавка;
Иначе
Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + Прибавка;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
Показать{Документ.ПередачаДокументов(38,46)}: Переменная не определена (Объект)
Запрос.УстановитьПараметр("ЭтотДокумент", <<?>>Объект.Ссылка); (Проверка: Сервер)
(43) Uncore,
"(40) в примере (34) эта проблема исключена."
я так понимаю - только по той причине, что находится этот блок кода в процедуре проведения - то есть предыдущие движения документа система уже откатила
p.s. вообще формировать движения на основании данных, которые этими же движениями и модифицируются... бррр. избегаю где только могу ))
"(40) в примере (34) эта проблема исключена."
я так понимаю - только по той причине, что находится этот блок кода в процедуре проведения - то есть предыдущие движения документа система уже откатила
p.s. вообще формировать движения на основании данных, которые этими же движениями и модифицируются... бррр. избегаю где только могу ))
(52) движения в данном случае данные не модифицируют, как раз наоборот: сначала заполняются данные в табличной части документа, а затем делаются по ним движения.
Вернемся к задаче: а может лучше проставлять номера копий при заполнении табличной части документа? Например при изменении вида документа, или по кнопке Заполнить, если таковая имеется. При этом делать запрос в регистр с учетом уже введенных в табличную часть данных. А при записи/перед записью уже ничего с табличной частью не делать, т.к. номера уже проставлены. Остается их только записать. При отмене проведения записи из регистра удалятся.
Вернемся к задаче: а может лучше проставлять номера копий при заполнении табличной части документа? Например при изменении вида документа, или по кнопке Заполнить, если таковая имеется. При этом делать запрос в регистр с учетом уже введенных в табличную часть данных. А при записи/перед записью уже ничего с табличной частью не делать, т.к. номера уже проставлены. Остается их только записать. При отмене проведения записи из регистра удалятся.
(54) тут канеш хозяин-барин :) зато сразу будет видно какие номера проставились. А так только после записи номера проставятся, имхо, первый вариант нагляднее. Если все же второй метод использовать, то я за вариант, в котором делается сначала запрос к данным, а потом заполняются номера. Так правильнее, чем делать запрос в цикле: при больших объемах оперируемых данных возможны подвисания...
тогда нужно сдалть отлкьную таблицу с максимальными значениями из регистров. а затем уже пробежаться по строкам документа, искать нужную строчку в табличке, и там ее наращивать.
Что-то вроде:
В звапросе убираем условие или меняем его на условие вхождение всех документов (что правильнее)
тНомера = Запрос.Выполнить.Выгрузить();
ДЛя каждой строкаТ из СписокДокумента цикл
СтрокаДанных = тНомера.Найти(СтрокаТ.Документ);
Если СтрокаДанных = неопределено тогда
СтрокаДанных = тНомера.Добавить();
СтрокаДанных.Документ = СтрокаТ.Документ;
КонецЕсли;
строкаТ.НомерЭкземпляра = 1+СтрокаДанных.ПоследнийНОмер;
СтрокаДанных.ПоследнийНОмер = строкаТ.НомерЭкземпляра;
КонецЦикла;
ТОлько видимо еще надо блокировки ставить, на случай паралельного провдения разных документов. Хотя пока можно на этом не заморачиваться.
В регистр должна уйти "схлопнтуая" информация, т.е. таблица тНОмера, так как в ней макисмальные номера харнятся
Что-то вроде:
В звапросе убираем условие или меняем его на условие вхождение всех документов (что правильнее)
тНомера = Запрос.Выполнить.Выгрузить();
ДЛя каждой строкаТ из СписокДокумента цикл
СтрокаДанных = тНомера.Найти(СтрокаТ.Документ);
Если СтрокаДанных = неопределено тогда
СтрокаДанных = тНомера.Добавить();
СтрокаДанных.Документ = СтрокаТ.Документ;
КонецЕсли;
строкаТ.НомерЭкземпляра = 1+СтрокаДанных.ПоследнийНОмер;
СтрокаДанных.ПоследнийНОмер = строкаТ.НомерЭкземпляра;
КонецЦикла;
ТОлько видимо еще надо блокировки ставить, на случай паралельного провдения разных документов. Хотя пока можно на этом не заморачиваться.
В регистр должна уйти "схлопнтуая" информация, т.е. таблица тНОмера, так как в ней макисмальные номера харнятся
Я может ошибаюсь, но тут надо немного изменить сам подход.
Обычно, конгда нужне независмый номератор по тому или иному признаку делал отделнтый (не периодический, не зависмый) регистр сведений с измерееним "признак номератора" и текущий номер.
Отдельная процедура каждый раз обращалсь к этому регистру, получала новый номер и записывала его туда - так добиывлись уникальности номеров.
ПО сути дела это имитация номератора.
В примере - нумерация по каждой орагнизации отдельно
Функция размещена в общем модуле
ЗЫ. Если конечно делать все совсем по уму, тут еще нужно вначале блокировку поставить - ну это уже нюансы (счиатем что одновремено много пользователей рабоать не будут)
ЗЫ2. Сразу скажу типовой номератор тут не используется по ряду причин - номеруются ни документы, ни справочники.
Обычно, конгда нужне независмый номератор по тому или иному признаку делал отделнтый (не периодический, не зависмый) регистр сведений с измерееним "признак номератора" и текущий номер.
Отдельная процедура каждый раз обращалсь к этому регистру, получала новый номер и записывала его туда - так добиывлись уникальности номеров.
ПО сути дела это имитация номератора.
В примере - нумерация по каждой орагнизации отдельно
Функция ПолучитьНомер(Организация) экспорт
Номер = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| НомераторОрагнизаций.Номер
|ИЗ
| РегистрСведений.НомераторОрагнизаций КАК НомераторОрагнизаций
|ГДЕ
| НомераторОрагнизаций.Организация = &Организация";
Запрос.УстановитьПараметр("Организация",Организация);
Выборка = Запрос.Выполнить().Выбрать();
ЕСли Выборка.Следующий() тогда
Номер = Выборка.Номер;
КонецЕсли;
НОмер = НОмер+1;
// сохраняем номер
Запись = РегистрыСведений.НомераторОрагнизаций.СоздатьМенеджерЗаписи();
Запись.Организация = Организация;
Запись.Номер = Номер;
Запись.Записать(истина);
возврат СокрЛП(Организация.Префикс+"-"+Номер);
КонецФункции
ПоказатьФункция размещена в общем модуле
ЗЫ. Если конечно делать все совсем по уму, тут еще нужно вначале блокировку поставить - ну это уже нюансы (счиатем что одновремено много пользователей рабоать не будут)
ЗЫ2. Сразу скажу типовой номератор тут не используется по ряду причин - номеруются ни документы, ни справочники.
Прикрепленные файлы:
Измерения - это ключевые поля, т.е. они определяют "что характеризуем"
Ресурсы- это значения, т.е. они определяют "харктеристику" Измерений, их состояние.
Есть еще Реквизиты - это просто примечание.
Например в случае валюты:
Сама валюта (рубли, доллары) - это измерения(мы ее определяем)
Курс валюты - это ресурс (описание состояния той или иной валюты, валюта одна и та же состояние разные)
Реквизит может быть например - "Кто обновил" - просто справочная информация ни к чему не обязывающая..
Это я конечно несколько сумбурно пытаюсь описать - в книжках куда лушче :)
Ресурсы- это значения, т.е. они определяют "харктеристику" Измерений, их состояние.
Есть еще Реквизиты - это просто примечание.
Например в случае валюты:
Сама валюта (рубли, доллары) - это измерения(мы ее определяем)
Курс валюты - это ресурс (описание состояния той или иной валюты, валюта одна и та же состояние разные)
Реквизит может быть например - "Кто обновил" - просто справочная информация ни к чему не обязывающая..
Это я конечно несколько сумбурно пытаюсь описать - в книжках куда лушче :)
вот рабочий код:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Для Каждого Строка Из СписокДокументов Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
| ЖурналПередачиДокументов.Документ КАК Документ
|ИЗ
| РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
|ГДЕ
| ЖурналПередачиДокументов.Документ = &Документ
|
|СГРУППИРОВАТЬ ПО
| ЖурналПередачиДокументов.Документ";
Запрос.УстановитьПараметр("Документ", Строка.Документ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Результат.Следующий() Тогда
Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;
Иначе
Строка.НомерЭкземпляра = 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
Показать
(63) nkvg_a,
Вообще не понятно что вы предлагаете. Какой номер документа? а если мы передаем приказ №5 во 2 строке, знач номер экземпляра будет 7? если вы это имеете ввиду, то если я в следующий раз передам его опять во 2 строке то тоже получается 7. И нумерация будет не по порядку а вразноброс. Если вам известны требования международных стандартов, например ИСО 9001, в нем есть понятие "Управление документацией", в которой сказано что все копии документов должны контролироваться. А раздел "Управление записями" определяет порядок ведения записей, в котором написано, что нумерация записей должна быть по порядку. Вообще непонятное предложение
Вообще не понятно что вы предлагаете. Какой номер документа? а если мы передаем приказ №5 во 2 строке, знач номер экземпляра будет 7? если вы это имеете ввиду, то если я в следующий раз передам его опять во 2 строке то тоже получается 7. И нумерация будет не по порядку а вразноброс. Если вам известны требования международных стандартов, например ИСО 9001, в нем есть понятие "Управление документацией", в которой сказано что все копии документов должны контролироваться. А раздел "Управление записями" определяет порядок ведения записей, в котором написано, что нумерация записей должна быть по порядку. Вообще непонятное предложение
Задача следующая: при записи документа автоматически расставить номера копий для каждого документа из табличной части. Номер должен быть уникальным. Вроде все просто, сделал так:
Где про порядок? вопрос про уникальность?
Где про порядок? вопрос про уникальность?
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот