Как выгрузить данные регистра сведений в операцию

1. 1Cuser38 10.08.17 09:54 Сейчас в теме
Добрый день, я не очень много программирую, поэтому у меня возникла проблема. При свертке базы период регистра сведений СостоянияОСОрганизаций сменился на конец года свертки, теперь при печати счета на оплату не проставляется дата принятия к учету. Я взял базу до свертки, создал там новую операцию и попытался написать обработку, чтобы выгрузить данные регистра сведений в эту операцию, но не получается. В дальнейшем думал типовой обработкой ВыгрузкаЗагрузкаXML выгрузить эту операцию и загрузить ее в базу после свертки, чтобы даты снова стали нормальными.
Не получается выгрузить данные регистра в операцию. Вот код:
&НаКлиенте
Процедура Обработать(Команда)
	ОбработатьНаСервере();
КонецПроцедуры

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

Я понимаю, что тут не до конца дописано, но не пойму, как дальше заполнить этот набор записей в операцию. Подскажите, пожалуйста.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. japopov 68 10.08.17 10:04 Сейчас в теме
(1)
Во-первых, установить в наборе записей свойство Записывать.
Во-вторых, вызвать явно метод НаборЗаписей.Записать(Истина).
В-третьих, запрос, скорее всего, неверный: нет параметров отбора. Вы правда хотите загнать туда весь регистр сведений?
+
3. 1Cuser38 10.08.17 10:08 Сейчас в теме
(2)
ну вообще, хотел весь загнать. А остальное сейчас попробую, спасибо за совет.
+
4. kzotiks 10.08.17 10:21 Сейчас в теме
А если Вам просто выгрузить перенести весь регистр сведений с помощью стандартной обработки "Выгрузка и загрузка данных XML.epf" и не создавать документ операция, хотя всё равно нужно будет указать регистратор в записи по ОС.
Может лучше ручками заполнить документ Операция.
+
6. 1Cuser38 10.08.17 10:26 Сейчас в теме
(4)
5878 записей, вручную не очень хорошо
+
8. kzotiks 10.08.17 10:31 Сейчас в теме
(6) Тогда понимаю, но написанный Вами код совсем не поможет. Google в помощь, искать "программное создание документа операция 1с" и понять как делать записи по регистру сведений.
+
10. 1Cuser38 10.08.17 10:34 Сейчас в теме
(8)
Я документ создал руками, а вот заполнить хотел обработкой, пока не получается, все гуглю и гуглю.
+
12. kzotiks 10.08.17 10:41 Сейчас в теме
(10) И какая связь между движениями по регистру и руками созданным документом, вернее его табличной частью движений по регистру ?
+
5. SPID 10.08.17 10:25 Сейчас в теме
Не очень понятно что вы хотитете сделать. НаборЗаписей в вашем коде это что?
Если вы про типовой документ типа ОперацияБух, тогда надо заполнить движения документа и записать их либо заполнять документ интерактивно. При этом регистратором будет сам документ операция.
+
7. 1Cuser38 10.08.17 10:28 Сейчас в теме
(5)
Да типовой документ ОперацияБух. У меня на форме обработки поле ввода, там выбираю ДокументОперации у которого тип ДокументСсылка.ОперацияБух. И в выбранный документ операции надо записать данные регистра сведений СостоянияОСОрганизаций
+
9. SPID 10.08.17 10:32 Сейчас в теме
(7) тогда как минимум необходимо заменить НаборЗаписей.Загрузить(Результат); на ТутОбъектОперация.Движения.СостоянияОСОрганизаций.Загрузить(Результат). Затем записать ТутОбъектОперация.
+
11. SPID 10.08.17 10:38 Сейчас в теме
Попробуйте так.

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

КонецПроцедуры
Показать
+
14. 1Cuser38 10.08.17 10:44 Сейчас в теме
(11)
Ошибок нет, но и документ пустой
+
13. SPID 10.08.17 10:41 Сейчас в теме
Только я насчет периода не уверен, можно ли в типовом документе записывать движения с периодом отличным от даты документа... А то придется создавать документы по каждому периоду.
+
15. SPID 10.08.17 10:55 Сейчас в теме
Отладчик в помощь. Посмотреть что в результате запроса и обработчики событий записи операции - может там очищается что то.
+
16. SPID 10.08.17 11:02 Сейчас в теме
Для теста можно попробовать следующее, так как есть подозрения, что в типовой при записи операции устанавливается отбор по периоду/регистратору (проверить сейчас негде).

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

КонецПроцедуры
Показать
+
17. 1Cuser38 10.08.17 11:12 Сейчас в теме
(16)
Все равно пусто.
Попробовал по-другому, заполняется только одна строка, потом ошибка, что запись с такими ключевыми полями существует.
НаборЗаписей = РегистрыСведений.СостоянияОСОрганизаций.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Регистратор.Установить(ДокументОперации);
	НаборЗаписей.Прочитать();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	СостоянияОСОрганизаций.Период,
		|	СостоянияОСОрганизаций.Регистратор,
		|	СостоянияОСОрганизаций.НомерСтроки,
		|	СостоянияОСОрганизаций.Активность,
		|	СостоянияОСОрганизаций.ОсновноеСредство,
		|	СостоянияОСОрганизаций.Организация,
		|	СостоянияОСОрганизаций.ДатаСостояния,
		|	СостоянияОСОрганизаций.Состояние,
		|	СостоянияОСОрганизаций.МоментВремени
		|ИЗ
		|	РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций";
	
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	Пока Выборка.Следующий() Цикл
		НоваяЗапись = НаборЗаписей.Добавить();
		НоваяЗапись.Период = Выборка.Период;
		НоваяЗапись.Регистратор = Выборка.Регистратор;
		НоваяЗапись.ОсновноеСредство = Выборка.ОсновноеСредство;
		НоваяЗапись.Активность = Выборка.Активность;
		Новаязапись.Организация = Выборка.Организация;
		НоваяЗапись.ДатаСостояния = Выборка.ДатаСостояния;
		НоваяЗапись.Состояние = Выборка.Состояние;
		
		НаборЗаписей.Записывать = истина;
		НаборЗаписей.Записать();
	КонецЦикла;
Показать
+
18. kzotiks 10.08.17 11:14 Сейчас в теме
Тихий ужас.... Вы этим хотите заполнить движения регистра сведений где регистратор документ операция ?
+
19. 1Cuser38 10.08.17 11:15 Сейчас в теме
(18) ну я не особо разбираюсь в программировании, вот пытаюсь разобраться...
+
20. kzotiks 10.08.17 11:27 Сейчас в теме
(19) Тогда понятно, попробуйте только на тестовой плиз

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

	//Проверим на пустой запрос и сбросим 
	Если РезультатЗапроса.Пустой() Тогда
		Сообщить("Нет ничего, ОШЫПКА :) !");
		Возврат;
	Иначе 
		Пока Выборка.Следующий() Цикл
			
			////Заполняем проводки операции
			Проводка = Набор.Добавить();
			Проводка.Активность = Истина;
			Проводка.Организация = Организация;
			Проводка.Период = ДокументОперация.Дата;
			
			////Делаем сторно по остаткам 
			СтрокаСостоянияОСОрганизаций = ДокументОбъект.Движения.СостоянияОСОрганизаций.Добавить();         
			СтрокаСостоянияОСОрганизаций.Активность		 		= Истина; 
			СтрокаСостоянияОСОрганизаций.ДатаСостояния 			= Выборка.ДатаСостояния;
			СтрокаСостоянияОСОрганизаций.Организация			= Выборка.Организация;
			СтрокаСостоянияОСОрганизаций.ОсновноеСредство 		= Выборка.ОсновноеСредство;
			СтрокаСостоянияОСОрганизаций.Состояние   			        = Выборка.Состояние;
			
		КонецЦикла;
		
		//В запись документ.
		ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

		Сообщить("Сделано !");
		
	КонецЕсли;
	
КонецПроцедуры
Показать



Слепил быстро на коленке, выборка по первым 200, сами поправите.
1Cuser38; +1
21. SPID 10.08.17 11:33 Сейчас в теме
(20) Таким образом, как я и предполагал, все же придется на каждую организацию и на каждую дату надо сделать отдельный типовой документ операции....
+
25. kzotiks 10.08.17 11:52 Сейчас в теме
26. SPID 10.08.17 12:08 Сейчас в теме
(25) об этих строках
Проводка.Организация = Организация;
Проводка.Период = ДокументОперация.Дата;


В выборке же нет отбора по организации или периоду - следовательно в выборку попадут все данные регистра, например:
01.01.01; Организация1; Состояние1
01.05.01; Организация1; Состояние2
01.05.01; Организация2; Состояние1
...

При записи в регистр по предоставленному алгоритму будут записи
01.01.01; Организация1; Состояние1
01.01.01; Организация1; Состояние2
01.01.01; Организация1; Состояние1

тут и возникает ошибка Запись с такими ключевыми полями существует...
+
27. kzotiks 10.08.17 12:13 Сейчас в теме
(26) Конечно по организации по каждой, просто не понял вопроса. Вот только дата тут при чем ?
+
28. SPID 10.08.17 12:25 Сейчас в теме
(27) Действительно, Проводка это оказывается РБ тут - не заметил.
Ну ок.
А с периодом что будет при записи операции? РС вероятно с периодичностью по позиции регистратора.
Если в регистре такие записи
Регистратор1; Организация1; Состояние1
Регистратор2; Организация1; Состояние2
Регистратор3; Организация1; Состояние1

Потом, насколько я помню, при записи типового документа ОперацияБух были какие то обработки записываемых наборов, там организация не устанавливается из значения шапки документа?
+
29. kzotiks 10.08.17 12:35 Сейчас в теме
(28) Да конечно поменяет организацию по данным шапки, под многофирменный учет код ну явно не рассчитан, хотя можно добавить отбор в запрос по организации из реквизита шапки документа операция.
А период РС по дате документа станет,но разве не Дата из Состояние нам нужна.
+
30. SPID 10.08.17 12:48 Сейчас в теме
(29) Дата нам может и из состояния нужна, но при записи строк по операции строки будут следующими
РегистраторОперация; Организация1; Состояние1
РегистраторОперация; Организация1; Состояние2
РегистраторОперация; Организация1; Состояние1

Первая и последняя запись не будут вызывать ошибку Запись с такими ключевыми полями существует?
+
31. kzotiks 10.08.17 12:54 Сейчас в теме
Честно говоря я не понимаю, про какой счет на оплату ТС говорит ?

(30) Будут ошибки свернет в запросе и сгруппирует их или пусть СостоянияОСОрганизацийСрезПоследних использует.
+
34. 1Cuser38 11.08.17 05:15 Сейчас в теме
(31)
Попробовал через срез последних, ошибок нет, но и скопировалось не все. Одно из ОС было сначала принято к учету, потом снято с учета. Скопировалось только снятие с учета. И в регистре сведений записалась эта операция с новым периодом. Видимо это не подойдет, т.к. мне скорее всего надо, чтобы период операции соответствовал ранее введенныым периодам. Наверное надо на каждый период создавать новую операцию и записывать туда данные этого периода, тогда я думаю проблем с дублями не будет?
+
22. 1Cuser38 10.08.17 11:36 Сейчас в теме
(20)
Попробовал на Демо базе БП 3.0.51.20, вылазит ошибка "Запись с такими ключевыми полями существует..." во время выполнения цикла по выборке
+
23. 1Cuser38 10.08.17 11:37 Сейчас в теме
(20)
Хотя записей вроде получилось столько же, сколько и было в регистре
+
24. kzotiks 10.08.17 11:41 Сейчас в теме
(20) Значит есть дубль записи, очищайте записи в документе Операция.
+
33. 1Cuser38 11.08.17 05:07 Сейчас в теме
(24)
Развернул новую демо базу, там в регистре всего 5 записей. Все равно ошибка про дубли.
+
37. kzotiks 11.08.17 09:50 Сейчас в теме
(33) Писал уже, очищайте записи по регистру в документе операция, программно или руками, потом обработка.

(34) "период операции соответствовал ранее введенным периодам" Зачем вам это, уверены ?
+
39. 1Cuser38 11.08.17 09:51 Сейчас в теме
(37)
Ну там какая-то печатная форма была, там сравнивает периоды, не знаю зачем, но надо, чтобы были одинаковые. поэтому на каждый период создал новую операцию
+
32. kzotiks 10.08.17 13:09 Сейчас в теме
Кстати намерено не указал на ОбменДанными.Загрузка = Истина , скажем так от греха подальше.
Ведь и даты и движения по фирмам будут "идеальны", у него ведь перенос данных будет.
+
36. 1Cuser38 11.08.17 09:37 Сейчас в теме
(32)
Попытался сделать с помощью Вашего кода, вроде бы получилось. Надеюсь, что правильно

&НаСервере
Процедура ОбработатьНаСервере() 	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ 
	|	СостоянияОСОрганизаций.Период КАК Период,
	|	СостоянияОСОрганизаций.Регистратор,
	|	СостоянияОСОрганизаций.НомерСтроки,
	|	СостоянияОСОрганизаций.Активность,
	|	СостоянияОСОрганизаций.ОсновноеСредство,
	|	СостоянияОСОрганизаций.Организация,
	|	СостоянияОСОрганизаций.ДатаСостояния,
	|	СостоянияОСОрганизаций.Состояние,
	|	СостоянияОСОрганизаций.МоментВремени
	|ИЗ
	|	РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций
	|
	|УПОРЯДОЧИТЬ ПО
	|	Период";
	
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	СтараяДата = "00010101";
	Пока Выборка.Следующий() Цикл 
		Если Выборка.Период <> СтараяДата Тогда
			СтараяДата = Выборка.Период; 
			Операция = Документы.ОперацияБух.СоздатьДокумент();
			Организация = БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");
			Операция.Организация = Организация;
			Операция.Ответственный = Пользователи.ТекущийПользователь();
			Операция.ПометкаУдаления = Ложь;
			ТекстСодержания = "Перенос данных ОС";	
			Операция.Содержание = ТекстСодержания;
			Операция.Дата = Выборка.Период; 
			Операция.Записать(РежимЗаписиДокумента.Запись);
			СтрокаРегистра = Операция.ТаблицаРегистровСведений.Добавить();
			СтрокаРегистра.Имя = "СостоянияОСОрганизаций";
			
			Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
			Набор.Отбор.Регистратор.Установить(Операция.Ссылка, Истина);
			Набор.Очистить();
			Набор.Записать();
			Операция.Движения.СостоянияОСОрганизаций.Записывать = Истина;
			Регистрировать = Истина;
		КонецЕсли;
			
		Проводка = Набор.Добавить();
		Проводка.Активность = Истина;
		Проводка.Организация = Организация;
		Проводка.Период = ДокументОперации.Дата;
		
		СтрокаСостоянияОСОрганизаций = Операция.Движения.СостоянияОСОрганизаций.Добавить();         
		СтрокаСостоянияОСОрганизаций.Активность = Истина; 
		СтрокаСостоянияОСОрганизаций.ДатаСостояния = Выборка.ДатаСостояния;
		СтрокаСостоянияОСОрганизаций.Организация = Выборка.Организация;
		СтрокаСостоянияОСОрганизаций.ОсновноеСредство = Выборка.ОсновноеСредство;
		СтрокаСостоянияОСОрганизаций.Состояние = Выборка.Состояние;
		Операция.Записать(РежимЗаписиДокумента.Запись);	
	КонецЦикла;
Показать
+
35. 1Cuser38 11.08.17 06:58 Сейчас в теме
Думаю надо не создавать вручную операцию, а создать программно по каждому периоду в РС с этми периодом и заполнить всеми записями этого периода.
+
38. 1Cuser38 11.08.17 09:50 Сейчас в теме
Остался небольшой вопрос, как добавить туда еще один регистр СобытияОС?
+
40. kzotiks 11.08.17 09:56 Сейчас в теме
Добавьте Операция.ОбменДанными.Загрузка = Истина; и проверьте периоды после заполнения одним документом операция.

Надеюсь вы просто учитесь и пытаетесь разобраться.
+
41. 1Cuser38 11.08.17 10:12 Сейчас в теме
(40)
Ну вообще я как бы и учусь, и буду делать это на реальной базе
+
Внимание! Тема сдана в архив

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