Автоматическая нумерация в табличной части

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. fatalist56 19.02.12 18:38 Сейчас в теме
Всем привет!
Уже поднимал эту тему, потом бросил ей заниматься, сейчас вернулся снова.
1с; Документооборот, 8.2.
Есть документ "ПередачаДокументов", в котором есть табличная часть "СписокДокументов".
Реквизиты табличной части:
Документ - СправочникСсылка.ВнутренниеДокументы;
ТипЭкземпляра - Перечисление (Оригинал или копия);
НомерЭкземпляра - Число;
Получатель - СправочникСсылка.ФизическиеЛица.

Задача следующая: при записи документа автоматически расставить номера копий для каждого документа из табличной части. Номер должен быть уникальным. Вроде все просто, сделал так:

В модуле объекта
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) 
	Для Каждого Строка Из СписокДокументов Цикл
	 	Запрос = Новый Запрос; 
		Запрос.Текст = "ВЫБРАТЬ
					   |	МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
					   |	ЖурналПередачиДокументов.Документ КАК Документ
					   |ИЗ
					   |	РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
					   |ГДЕ
					   |	ЖурналПередачиДокументов.Документ = &Документ
					   |
					   |СГРУППИРОВАТЬ ПО
					   |	ЖурналПередачиДокументов.Документ";
		Запрос.УстановитьПараметр("Документ", Строка.Документ);
		Результат = Запрос.Выполнить();
		Выборка = Результат.Выбрать(); 
		Если Результат.Пустой() Тогда
			Строка.НомерЭкземпляра = 1;
		Иначе
			Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;
		КонецЕсли; 
КонецЦикла; 
КонецПроцедуры;

Показать


Не работает, выдает ошибку о неуникальности записи. В чем проблема? что не так?
Заранее благодарю, весь мозг сломал уже
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. fatalist56 19.02.12 18:57 Сейчас в теме
Выборка.ПоследнийНомер - {(1)}: Значение не является значением объектного типа (ПоследнийНомер)
Что это может значить? Строка.Документ определил правильно
12. Ягг 495 19.02.12 18:59 Сейчас в теме
(9) fatalist56, не прошло позиционирование выборки. ее можно смотерть только после операции Выборка.Следующий()
15. fatalist56 19.02.12 19:01 Сейчас в теме
(12) Ягг,
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) 
	Для Каждого Строка Из СписокДокументов Цикл
	 	Запрос = Новый Запрос; 
		Запрос.Текст = "ВЫБРАТЬ
					   |	МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
					   |	ЖурналПередачиДокументов.Документ КАК Документ
					   |ИЗ
					   |	РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
					   |ГДЕ
					   |	ЖурналПередачиДокументов.Документ = &Документ
					   |
					   |СГРУППИРОВАТЬ ПО
					   |	ЖурналПередачиДокументов.Документ";
		Запрос.УстановитьПараметр("Документ", Строка.Документ);
		Результат = Запрос.Выполнить();
		Выборка = Результат.Выбрать(); 
		Если Не Выборка.Следующий() Тогда
			Строка.НомерЭкземпляра = 1;
		Иначе
			Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;
		КонецЕсли; 
КонецЦикла; 
КонецПроцедуры;
Показать

Как раз после операции Выборка.Следующий()
18. Ягг 495 19.02.12 19:05 Сейчас в теме
(15) fatalist56, если поставить точку останова на строчку "Строка.НомерЭкземпляра = 1;" или любу выше "Если" то Выборка.ПоследнийНомер выдаст ошибку так как выборка еше не спозиционирована.
Вот если поставить точку останова в строку "Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;" тогда ошибки быть не должно. Но может конечно затесались английские бууквы и тогда написание в запросе отличается от написания в строке.
19. shatshat 19.02.12 19:07 Сейчас в теме
(15) fatalist56,

дурацкий уточняющий вопрос - НомерЭкземпляра в регистре сделано измерением? (Вы сами его добавили, я так понял)
20. fatalist56 19.02.12 19:09 Сейчас в теме
(19) shatshat, Да, измерением. Сделал не сам, был в типовой конфе.
Вот если поставить точку останова в строку "Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;" тогда ошибки быть не должно.

Поставил где написали - все равно переменная не определена. Текст переписывал сто раз английские буквы затесаться не должны, тем более что Пунто стоит :)
24. Ягг 495 19.02.12 19:15 Сейчас в теме
(20) fatalist56, очень страно, желательно скан увидеть :)
62. пользователь 23.02.12 14:20
Сообщение было скрыто модератором.
...
2. shatshat 19.02.12 18:43 Сейчас в теме
а то, что Выборка.Следующий() нигде не фигурирует - это нормально?
да и Результат.Пустой() для меня,например, необычно. Выборка.Количество()=0
3. fatalist56 19.02.12 18:45 Сейчас в теме
Я к сожалению не программист а экономист :) поэтому если не сложно скажите где надо поставить этот элемент кода
4. Ягг 495 19.02.12 18:45 Сейчас в теме
А где Выборка.Следующий()?
Если не ошибаюсь у тебя без этого Выборка.ПоследнийНомер все время равен NULL, в результате в строку записывается 0 (или 1 - надо в отладчике смотерть). Вот и повторения при проведении.
или нет?

Вобщем добавиь вместо Результат.Пустой() текст

.... Если Не выборка.Следующий() тогда...
5. shatshat 19.02.12 18:48 Сейчас в теме
поддерживаю Ягг. именно так будет "красивее"
6. fatalist56 19.02.12 18:49 Сейчас в теме
Все равно ошибка
"Запись с такими ключевыми полями существует!"
7. fatalist56 19.02.12 18:52 Сейчас в теме
А в отладчике не определяет переменные эти. Ни "Документ", ни "ПоследнийНомер"
8. Ягг 495 19.02.12 18:54 Сейчас в теме
Тогда нужно смотерть не тут, а в ОбработкеПровденеия (или в обработке ПриЗаписи - что мало вероятно). Может быть там забыли перебор строк сделать.

А в отладчике надо смотреть "Строка.Документ" и "Выборка.ПоследнийНОмер"
11. fatalist56 19.02.12 18:59 Сейчас в теме
(8) Ягг,
Тогда нужно смотерть не тут, а в ОбработкеПровденеия (или в обработке ПриЗаписи - что мало вероятно). Может быть там забыли перебор строк сделать.

А нужно еще где то сделать перебор строк? А для чего?
13. Ягг 495 19.02.12 19:00 Сейчас в теме
(11) fatalist56, ну я так понял что движение по регистрам то далется там и для каждой строки свое. или как-то иначе ораганизована запсиь в регистр сведений?
10. shatshat 19.02.12 18:58 Сейчас в теме
дубли документов в строках?
а вообще - ошибка то не тут возникла. регистр сведений какой то заполняется, видимо - здесь я этого не наблюдаю. оттуда и плясать для начала то
14. fatalist56 19.02.12 19:00 Сейчас в теме
(10) shatshat, ЖурналПередачиДокументов - это и есть регистр. Заполняется он
Процедура ОбработкаПроведения(Отказ, Режим)
	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

	// регистр ЖурналПередачиДокументов
	Движения.ЖурналПередачиДокументов.Записывать = Истина;
	Для Каждого ТекСтрокаСписокДокументов Из СписокДокументов Цикл
		Движение = Движения.ЖурналПередачиДокументов.Добавить();
		Движение.Период = Дата;
		Движение.Документ = ТекСтрокаСписокДокументов.Документ;
		Движение.ТипЭкземпляра = ТекСтрокаСписокДокументов.ТипЭкземпляра;
		Движение.НомерЭкземпляра = ТекСтрокаСписокДокументов.НомерЭкземпляра;
		Движение.Пользователь = Пользователи.АвторизованныйПользователь();
		Движение.Получатель = ТекСтрокаСписокДокументов.Получатель;
		Движение.Комментарий = ТекСтрокаСписокДокументов.Комментарий;
	КонецЦикла;
Показать
16. Ягг 495 19.02.12 19:02 Сейчас в теме
(14) fatalist56, ну наппример если в двух строчках табличной части два одинаковых документа (или две пустые ссылки), то система попробует их запистаь два раза - в результате ошибка по дублированию. как одна из возможных.
17. fatalist56 19.02.12 19:03 Сейчас в теме
(16) Ягг, Все верно, только мне нужно если документ одинаковый то для второй записи он подставил следующий номер. Как это можно реализовать?
22. Ягг 495 19.02.12 19:13 Сейчас в теме
(17) fatalist56, тогда нужно сдалть отлкьную таблицу с максимальными значениями из регистров. а затем уже пробежаться по строкам документа, искать нужную строчку в табличке, и там ее наращивать.

Что-то вроде:

В звапросе убираем условие или меняем его на условие вхождение всех документов (что правильнее)

тНомера = Запрос.Выполнить.Выгрузить();

ДЛя каждой строкаТ из СписокДокумента цикл
СтрокаДанных = тНомера.Найти(СтрокаТ.Документ);
Если СтрокаДанных = неопределено тогда
СтрокаДанных = тНомера.Добавить();
СтрокаДанных.Документ = СтрокаТ.Документ;
КонецЕсли;

строкаТ.НомерЭкземпляра = 1+СтрокаДанных.ПоследнийНОмер;
СтрокаДанных.ПоследнийНОмер = строкаТ.НомерЭкземпляра;

КонецЦикла;

ТОлько видимо еще надо блокировки ставить, на случай паралельного провдения разных документов. Хотя пока можно на этом не заморачиваться.

В регистр должна уйти "схлопнтуая" информация, т.е. таблица тНОмера, так как в ней макисмальные номера харнятся
21. shatshat 19.02.12 19:11 Сейчас в теме
"Все верно, только мне нужно если документ одинаковый то для второй записи он подставил следующий номер. Как это можно реализовать"

То есть у Вас в строках этого же документа ЕСТЬ дублирующиеся ВнутренниеДокументы?
Если в строке2 есть Документ7 и он же встречается в строке7 - ваш запрос в процедуре "ПередЗаписью" выдаст один и тот же НомерЭкземпляра ОБОИМ строкам
23. fatalist56 19.02.12 19:14 Сейчас в теме
(21) shatshat, да, специально поставил 2 одинаковых, а почему он им присваивает один номер? если после обхода каждой строки делается запись в регистре и каждый следующий запрос должен выводить новый последний номер?
25. Ягг 495 19.02.12 19:20 Сейчас в теме
(23) fatalist56, запрос вренет увлеиченный номер "после обхода каждой строки" только после завершения траназакции проведения, а тут запись. Да и в провдении запрос все равно это не вернет - там транзакция не завершена.
26. shatshat 19.02.12 19:22 Сейчас в теме
(23) fatalist56,

В момент выполнения процедуры ПередЗаписью() - регистр в этот момент никаким образом не меняется!!!
значит, при одинаковых параметрах запроса (в разных строках) даст один и тот же результат

(22) Ягг,

Модифицировать ПередЗаписью() с помощью объекта Соответствие.
Например так

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) 

   УпомянутыеДокументы = Новый Соответствие;
   Для Каждого Строка Из СписокДокументов Цикл
       Запрос = Новый Запрос; 
      Запрос.Текст = "ВЫБРАТЬ
                  |   МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
                  |   ЖурналПередачиДокументов.Документ КАК Документ
                  |ИЗ
                  |   РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
                  |ГДЕ
                  |   ЖурналПередачиДокументов.Документ = &Документ
                  |
                  |СГРУППИРОВАТЬ ПО
                  |   ЖурналПередачиДокументов.Документ";
      Запрос.УстановитьПараметр("Документ", Строка.Документ);
      Результат = Запрос.Выполнить();
      Выборка = Результат.Выбрать(); 
      Если Не Выборка.Следующий() Тогда
         Строка.НомерЭкземпляра = 1;
      Иначе

         Если УпомянутыеДокументы[Строка.Документ]=неопределено Тогда
           Прибавка=1; УпомянутыеДокументы[Строка.Документ]=1
         Иначе 
           УпомянутыеДокументы[Строка.Документ]=УпомянутыеДокументы[Строка.Документ]+1;
           Прибавка=УпомянутыеДокументы[Строка.Документ];
         КонецЕсли; 
         Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + Прибавка;
      КонецЕсли; 
КонецЦикла; 
КонецПроцедуры;
Показать
28. Ягг 495 19.02.12 19:26 Сейчас в теме
(26) shatshat, можно и через соотвествие - дулое вкуса :) только тут получается что для двух одинковых документов которыых нет в запросе обоим полстаивится - 1 (кажется, надо немножко текст подправить).
30. fatalist56 19.02.12 19:29 Сейчас в теме
(26) shatshat, Результат тот же самый(((
33. Ягг 495 19.02.12 19:34 Сейчас в теме
(30) fatalist56, Пока движение делается по каждой строке результат всегда будет один и тот-же. Нужно в движение давать сводную информацию - максимальных значений. Нужно обрботку проведения мучить. Там (через соотвесиве)

МаксНОмера = новый Соответсвие;
Для каждого СтрокаТ из СписокДокументов цикл
ТекНомер = Число( МаксНомер[СтрокаТ.Документ]); // по моему неопределено должно дать ноль - но надо проверить.
МаксНомер[СтрокаТ.Документ] = Макс(ТекНомер, СтрокаТ.НомерЭкземпляра);
КонецЦикла;

Для каждого Эл из МаксНОмера цикл
Движение = ..
Движение.Документ = Эл.Ключ;
Движение.НОмер = Эл.Значение;
КонецЦикла;

Кажется так
31. shatshat 19.02.12 19:30 Сейчас в теме
стоп! косяк ))) извините. при пустой выборке надо тоже это проделать

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) 

   УпомянутыеДокументы = Новый Соответствие;
   Для Каждого Строка Из СписокДокументов Цикл
       Запрос = Новый Запрос; 
      Запрос.Текст = "ВЫБРАТЬ
                  |   МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
                  |   ЖурналПередачиДокументов.Документ КАК Документ
                  |ИЗ
                  |   РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
                  |ГДЕ
                  |   ЖурналПередачиДокументов.Документ = &Документ
                  |
                  |СГРУППИРОВАТЬ ПО
                  |   ЖурналПередачиДокументов.Документ";
      Запрос.УстановитьПараметр("Документ", Строка.Документ);
      Результат = Запрос.Выполнить();
      Выборка = Результат.Выбрать(); 

         Если УпомянутыеДокументы[Строка.Документ]=неопределено Тогда
           Прибавка=1; УпомянутыеДокументы[Строка.Документ]=1
         Иначе 
           УпомянутыеДокументы[Строка.Документ]=УпомянутыеДокументы[Строка.Документ]+1;
           Прибавка=УпомянутыеДокументы[Строка.Документ];
         КонецЕсли; 

      Если Не Выборка.Следующий() Тогда
         Строка.НомерЭкземпляра = Прибавка;
      Иначе
         Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + Прибавка;
      КонецЕсли; 
КонецЦикла; 
КонецПроцедуры;
Показать


(23) fatalist56, пробуй, должно работать
32. fatalist56 19.02.12 19:34 Сейчас в теме
(31) shatshat, Черт, я вас обожаю :) (не поймите меня неправильно), сидел втыкался всю пятницу и все воскресенье... Все работает
27. shatshat 19.02.12 19:25 Сейчас в теме
коротенько по сути вышеприведенного кода

в каждой строке проверяем, упоминался ли документ выше.
если не упоминался - прибавка равна 1 (и запоминаем ее), если упоминался - увеличиваем прибавку (и запоминаем).
29. Ягг 495 19.02.12 19:27 Сейчас в теме
И потом все равно нужно будет отдельно решать вопрос с записью в регистр только максимальных значений.
34. Uncore 1274 19.02.12 19:34 Сейчас в теме
попробуйте так:
Если Ссылка.Пустая() Тогда
	Возврат;	
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ПередачаДокументовСписокДокументов.Документ,
|	ПередачаДокументовСписокДокументов.НомерЭкземпляра,
|	ПередачаДокументовСписокДокументов.НомерСтроки
|ПОМЕСТИТЬ ДанныеДокумента	
|ИЗ
|	Документ.ПередачаДокументов.Начисления КАК ПередачаДокументовСписокДокументов
|ГДЕ
|	ПередачаДокументовСписокДокументов.Ссылка = &Ссылка
|	И ДанныеДокумента.НомерЭкземпляра = 0
|;
|ВЫБРАТЬ
|	МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
|	ЖурналПередачиДокументов.Документ КАК Документ
|ПОМЕСТИТЬ ДанныеРегистра	
|ИЗ
|	РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
|ГДЕ
|  	ЖурналПередачиДокументов.Документ В (ВЫБРАТЬ ДанныеДокумента.Документ ИЗ ДанныеДокумента КАК ДанныеДокумента)

|СГРУППИРОВАТЬ ПО
|	ЖурналПередачиДокументов.Документ
|;	
|ВЫБРАТЬ
|	ДанныеДокумента.Документ,
|	ДанныеДокумента.НомерЭкземпляра,
|	ДанныеДокумента.НомерСтроки,
|	ЕСТЬNULL(ДанныеРегистра.ПоследнийНомер, 1) КАК ПоследнийНомер
|ИЗ
|	ДанныеДокумента КАК ДанныеДокумента
|	ЛЕВОЕ СОЕДИНЕНИЕ ДанныеРегистра КАК ДанныеРегистра
|	ПО ДанныеДокумента.Документ = ДанныеРегистра.Документ	
|УПОРЯДОЧИТЬ ПО
|	ДанныеДокумента.Документ
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Ссылка", Ссылка);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.СледующийПоЗначениюПоля("Документ") Цикл
	НачальныйНомер = Выборка.ПоследнийНомер;
	Пока Выборка.СледующийПоЗначениюПоля("НомерСтроки") Цикл
		СписокДокументов[Выборка.НомерСтроки - 1].НомерЭкземпляра = НачальныйНомер;
		
		НачальныйНомер = НачальныйНомер + 1;
	КонецЦикла;
КонецЦикла;	
Показать

Только поместить код в процедуру ПриЗаписи, когда ссылка уже имеется на документ.
35. fatalist56 19.02.12 19:36 Сейчас в теме
Ребят, всем большущее спасибо! не понимаю как это работает (через соответствие) сейчас буду читать чтобы знать. Но все работает
36. shatshat 19.02.12 19:42 Сейчас в теме
(35) fatalist56,

пожалуйста.

почитай про Соответствие. Очень интересный и удобный объект для анализа дублирования и подсчета (в процессе обхода) встречающихся элементов
37. Ягг 495 19.02.12 19:51 Сейчас в теме
ТОлько вот мне кажется что при этой реализации есть одна "мина" - если два документа паралельно начнут записываться (при многоаользовательском среверном варианте), то они получат из регистров одинаковые макимальные номера и непраивльно "подсчииаются". Т.е. произойдет наложение номеров.
38. shatshat 19.02.12 19:56 Сейчас в теме
(37) Ягг, согласен

но катастрофы случиться не должно - выскочит та самая ошибка, которую наблюдал автор в начале - транзакции проведений документов ведь цельны - то есть кто успеет а кто-то "обломится". Обломавшемуся придется увидеть ошибку и перезаписать/перепровести док
39. fatalist56 19.02.12 20:05 Сейчас в теме
(38) shatshat, (37) Ягг,
у нас право на создание таких документов будет всего у 4 человек, каждый из которых будет передавать свои типы документов. Поэтому вероятность ничтожна :)
40. fatalist56 19.02.12 20:42 Сейчас в теме
Единственная проблема - если 2 раза провести документ один и тот же - номера разные каждый раз присваивает
41. shatshat 19.02.12 20:48 Сейчас в теме
(40) fatalist56,

уфалла )))

причина понятна - в запросе при подсчете максимальнного учитывается и номер, заданный прошлым проведением этого же документа

попробуй усугубить запрос условием "И ЖурналПередачиДокументов.Регистратор<>&ЭтотДокумент"

плюс

Запрос.УстановитьПараметр("ЭтотДокумент", Объект.Ссылка);
46. fatalist56 19.02.12 20:56 Сейчас в теме
(41) shatshat,
попробуй усугубить запрос условием "И ЖурналПередачиДокументов.Регистратор<>&ЭтотДокумент"

плюс

Запрос.УстановитьПараметр("ЭтотДокумент", Объект.Ссылка);

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) 
   УпомянутыеДокументы = Новый Соответствие;
   Для Каждого Строка Из СписокДокументов Цикл
      Запрос = Новый Запрос; 
      Запрос.Текст = "ВЫБРАТЬ
                  |   МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
                  |   ЖурналПередачиДокументов.Документ КАК Документ
                  |ИЗ
                  |   РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
                  |ГДЕ
                  |   ЖурналПередачиДокументов.Документ = &Документ
				  |И ЖурналПередачиДокументов.Регистратор<>&ЭтотДокумент
                  |
                  |СГРУППИРОВАТЬ ПО
                  |   ЖурналПередачиДокументов.Документ";
      Запрос.УстановитьПараметр("Документ", Строка.Документ);
	  Запрос.УстановитьПараметр("ЭтотДокумент", Объект.Ссылка);

      Результат = Запрос.Выполнить();
      Выборка = Результат.Выбрать(); 

         Если УпомянутыеДокументы[Строка.Документ]=неопределено Тогда
           Прибавка=1; УпомянутыеДокументы[Строка.Документ]=1
         Иначе 
           УпомянутыеДокументы[Строка.Документ]=УпомянутыеДокументы[Строка.Документ]+1;
           Прибавка=УпомянутыеДокументы[Строка.Документ];
         КонецЕсли; 

      Если Не Выборка.Следующий() Тогда
         Строка.НомерЭкземпляра = Прибавка;
      Иначе
         Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + Прибавка;
      КонецЕсли; 
КонецЦикла; 
КонецПроцедуры;
Показать


{Документ.ПередачаДокументов(38,46)}: Переменная не определена (Объект)
Запрос.УстановитьПараметр("ЭтотДокумент", <<?>>Объект.Ссылка); (Проверка: Сервер)
43. Uncore 1274 19.02.12 20:49 Сейчас в теме
(40) в примере (34) эта проблема исключена.
49. fatalist56 19.02.12 21:01 Сейчас в теме
(43) Uncore, Не разбирал код, но при попытке отменить проведение вывалил ошибку
51. Uncore 1274 19.02.12 21:09 Сейчас в теме
(49) а какую ошибку, если не секрет? Можно указанный сразу поместить в процедуру ОбработкаПроведения перед записью данных в регистр.
52. shatshat 19.02.12 21:22 Сейчас в теме
(43) Uncore,

"(40) в примере (34) эта проблема исключена."

я так понимаю - только по той причине, что находится этот блок кода в процедуре проведения - то есть предыдущие движения документа система уже откатила


p.s. вообще формировать движения на основании данных, которые этими же движениями и модифицируются... бррр. избегаю где только могу ))
53. Uncore 1274 19.02.12 21:49 Сейчас в теме
(52) движения в данном случае данные не модифицируют, как раз наоборот: сначала заполняются данные в табличной части документа, а затем делаются по ним движения.
Вернемся к задаче: а может лучше проставлять номера копий при заполнении табличной части документа? Например при изменении вида документа, или по кнопке Заполнить, если таковая имеется. При этом делать запрос в регистр с учетом уже введенных в табличную часть данных. А при записи/перед записью уже ничего с табличной частью не делать, т.к. номера уже проставлены. Остается их только записать. При отмене проведения записи из регистра удалятся.
54. shatshat 19.02.12 22:16 Сейчас в теме
(53) Uncore,

да то же самое предлагаешь. только телодвижений больше ) отслеживать/формировать в процессе ввода ТЧ... зачем?
имхо, в конце редактирования, "скопом" - удобнее
что и реализовали. работает же :)
55. Uncore 1274 19.02.12 22:33 Сейчас в теме
(54) тут канеш хозяин-барин :) зато сразу будет видно какие номера проставились. А так только после записи номера проставятся, имхо, первый вариант нагляднее. Если все же второй метод использовать, то я за вариант, в котором делается сначала запрос к данным, а потом заполняются номера. Так правильнее, чем делать запрос в цикле: при больших объемах оперируемых данных возможны подвисания...
56. fatalist56 20.02.12 08:30 Сейчас в теме
(54) shatshat, (55) Uncore,
Так кнопка провести есть в окне документа. Ее жмешь - и документ не закрываясь проводится и видно какие номера присвоены
42. fatalist56 19.02.12 20:49 Сейчас в теме
И дальше 9 копии не добавляет((((
44. shatshat 19.02.12 20:50 Сейчас в теме
(42) fatalist56,
это вообще элементарно. посмотрите размерность поля НомерЭкземпляра. Число(1) вероятно ))
45. fatalist56 19.02.12 20:54 Сейчас в теме
(44) shatshat, Да, тупанул в регистре сведений длина 1 стояла
47. fatalist56 19.02.12 20:58 Сейчас в теме
50. shatshat 19.02.12 21:01 Сейчас в теме
(47) fatalist56,
а, ну да. просто Ссылка )
48. fatalist56 19.02.12 20:59 Сейчас в теме
Все, в параметре просто ссылку указал. Спасибо!!!!!
57. MaksIvanov 6 21.02.12 07:45 Сейчас в теме
тогда нужно сдалть отлкьную таблицу с максимальными значениями из регистров. а затем уже пробежаться по строкам документа, искать нужную строчку в табличке, и там ее наращивать.

Что-то вроде:

В звапросе убираем условие или меняем его на условие вхождение всех документов (что правильнее)

тНомера = Запрос.Выполнить.Выгрузить();

ДЛя каждой строкаТ из СписокДокумента цикл
СтрокаДанных = тНомера.Найти(СтрокаТ.Документ);
Если СтрокаДанных = неопределено тогда
СтрокаДанных = тНомера.Добавить();
СтрокаДанных.Документ = СтрокаТ.Документ;
КонецЕсли;

строкаТ.НомерЭкземпляра = 1+СтрокаДанных.ПоследнийНОмер;
СтрокаДанных.ПоследнийНОмер = строкаТ.НомерЭкземпляра;

КонецЦикла;

ТОлько видимо еще надо блокировки ставить, на случай паралельного провдения разных документов. Хотя пока можно на этом не заморачиваться.

В регистр должна уйти "схлопнтуая" информация, т.е. таблица тНОмера, так как в ней макисмальные номера харнятся
58. Ягг 495 21.02.12 09:01 Сейчас в теме
Я может ошибаюсь, но тут надо немного изменить сам подход.
Обычно, конгда нужне независмый номератор по тому или иному признаку делал отделнтый (не периодический, не зависмый) регистр сведений с измерееним "признак номератора" и текущий номер.

Отдельная процедура каждый раз обращалсь к этому регистру, получала новый номер и записывала его туда - так добиывлись уникальности номеров.

ПО сути дела это имитация номератора.

В примере - нумерация по каждой орагнизации отдельно
Функция ПолучитьНомер(Организация) экспорт
	Номер 		= 0;
	
	Запрос = Новый Запрос; 
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	НомераторОрагнизаций.Номер
	|ИЗ
	|	РегистрСведений.НомераторОрагнизаций КАК НомераторОрагнизаций
	|ГДЕ
	|	НомераторОрагнизаций.Организация = &Организация";
	Запрос.УстановитьПараметр("Организация",Организация);
	Выборка = Запрос.Выполнить().Выбрать();
	ЕСли Выборка.Следующий() тогда
		Номер =  Выборка.Номер;
	КонецЕсли;	
	
	НОмер 	= НОмер+1;
	// сохраняем номер
	Запись = РегистрыСведений.НомераторОрагнизаций.СоздатьМенеджерЗаписи();
	Запись.Организация 	= Организация;
	Запись.Номер		= Номер;
	Запись.Записать(истина);
	
	возврат СокрЛП(Организация.Префикс+"-"+Номер);
КонецФункции	
Показать


Функция размещена в общем модуле

ЗЫ. Если конечно делать все совсем по уму, тут еще нужно вначале блокировку поставить - ну это уже нюансы (счиатем что одновремено много пользователей рабоать не будут)

ЗЫ2. Сразу скажу типовой номератор тут не используется по ряду причин - номеруются ни документы, ни справочники.
Прикрепленные файлы:
59. fatalist56 21.02.12 11:24 Сейчас в теме
Кстати а по какому принципу Номер здесь - это ресурс? у меня он в типовой в виде измерения был. Вообще по какому признаку выбирать что отнести в ресурсы, что в реквизиты а что в измерения?
60. Ягг 495 21.02.12 11:30 Сейчас в теме
Измерения - это ключевые поля, т.е. они определяют "что характеризуем"
Ресурсы- это значения, т.е. они определяют "харктеристику" Измерений, их состояние.
Есть еще Реквизиты - это просто примечание.

Например в случае валюты:
Сама валюта (рубли, доллары) - это измерения(мы ее определяем)
Курс валюты - это ресурс (описание состояния той или иной валюты, валюта одна и та же состояние разные)
Реквизит может быть например - "Кто обновил" - просто справочная информация ни к чему не обязывающая..

Это я конечно несколько сумбурно пытаюсь описать - в книжках куда лушче :)
61. erdos 21.02.12 20:37 Сейчас в теме
вот рабочий код:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) 
   Для Каждого Строка Из СписокДокументов Цикл
       Запрос = Новый Запрос; 
      Запрос.Текст = "ВЫБРАТЬ
                  |   МАКСИМУМ(ЖурналПередачиДокументов.НомерЭкземпляра) КАК ПоследнийНомер,
                  |   ЖурналПередачиДокументов.Документ КАК Документ
                  |ИЗ
                  |   РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
                  |ГДЕ
                  |   ЖурналПередачиДокументов.Документ = &Документ
                  |
                  |СГРУППИРОВАТЬ ПО
                  |   ЖурналПередачиДокументов.Документ";
      Запрос.УстановитьПараметр("Документ", Строка.Документ);
      Результат = Запрос.Выполнить();
      Выборка = Результат.Выбрать(); 
      Если Результат.Следующий() Тогда
         Строка.НомерЭкземпляра = Выборка.ПоследнийНомер + 1;
      Иначе
         Строка.НомерЭкземпляра = 1;
      КонецЕсли; 
КонецЦикла; 
КонецПроцедуры;
Показать
63. nkvg_a 25.02.12 19:59 Сейчас в теме
А если использовать Строка.НомерЭкземпляра = Строка.НомерСтроки + Число(номер); - номер это номер документа тогда точно уникально и без всяких замут с запросами; жить нужно проще.
64. fatalist56 26.02.12 09:54 Сейчас в теме
(63) nkvg_a,
Вообще не понятно что вы предлагаете. Какой номер документа? а если мы передаем приказ №5 во 2 строке, знач номер экземпляра будет 7? если вы это имеете ввиду, то если я в следующий раз передам его опять во 2 строке то тоже получается 7. И нумерация будет не по порядку а вразноброс. Если вам известны требования международных стандартов, например ИСО 9001, в нем есть понятие "Управление документацией", в которой сказано что все копии документов должны контролироваться. А раздел "Управление записями" определяет порядок ведения записей, в котором написано, что нумерация записей должна быть по порядку. Вообще непонятное предложение
65. nkvg_a 26.02.12 10:54 Сейчас в теме
Задача следующая: при записи документа автоматически расставить номера копий для каждого документа из табличной части. Номер должен быть уникальным. Вроде все просто, сделал так:

Где про порядок? вопрос про уникальность?
66. fatalist56 27.02.12 10:17 Сейчас в теме
Ну в процессе обсуждения по моему все понятно написано :) и про уникальность в том числе
67. пользователь 04.03.12 14:18
Сообщение было скрыто модератором.
...
68. fatalist56 05.03.12 06:44 Сейчас в теме
(67)Игорь, Вы бы помечали кому именно вы пишете и в ответ на какой пост. А то непонятно где и при каком из вариантов кодов будет ошибка. У меня все работает, поэтому я думаю комментарий адресован для какого то другого кода
69. fatalist56 17.05.12 12:33 Сейчас в теме
Всем спасибо, тему закрываю
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот