Как выгрузить данные регистра сведений в операцию
Добрый день, я не очень много программирую, поэтому у меня возникла проблема. При свертке базы период регистра сведений СостоянияОСОрганизаций сменился на конец года свертки, теперь при печати счета на оплату не проставляется дата принятия к учету. Я взял базу до свертки, создал там новую операцию и попытался написать обработку, чтобы выгрузить данные регистра сведений в эту операцию, но не получается. В дальнейшем думал типовой обработкой ВыгрузкаЗагрузкаXML выгрузить эту операцию и загрузить ее в базу после свертки, чтобы даты снова стали нормальными.
Не получается выгрузить данные регистра в операцию. Вот код:
Я понимаю, что тут не до конца дописано, но не пойму, как дальше заполнить этот набор записей в операцию. Подскажите, пожалуйста.
Не получается выгрузить данные регистра в операцию. Вот код:
&НаКлиенте
Процедура Обработать(Команда)
ОбработатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбработатьНаСервере()
НаборЗаписей = РегистрыСведений.СостоянияОСОрганизаций.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументОперации);
НаборЗаписей.Прочитать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостоянияОСОрганизаций.Период,
| СостоянияОСОрганизаций.Регистратор,
| СостоянияОСОрганизаций.НомерСтроки,
| СостоянияОСОрганизаций.Активность,
| СостоянияОСОрганизаций.ОсновноеСредство,
| СостоянияОСОрганизаций.Организация,
| СостоянияОСОрганизаций.ДатаСостояния,
| СостоянияОСОрганизаций.Состояние,
| СостоянияОСОрганизаций.МоментВремени
|ИЗ
| РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций";
Результат = Запрос.Выполнить().Выгрузить();
НаборЗаписей.Загрузить(Результат);
КонецПроцедуры
ПоказатьЯ понимаю, что тут не до конца дописано, но не пойму, как дальше заполнить этот набор записей в операцию. Подскажите, пожалуйста.
По теме из базы знаний
- Разделение данных в БСП
- Контроль регистра сведений "Соответствие объектов информационных баз"
- Сравнение ЛЮБЫХ данных ЛЮБЫХ баз (и РИБ, по правилам конвертаций) по контрольным суммам выбранных реквизитов, работающих на платформе 8.3
- 1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена)
- Универсальная процедура для изменения набора записей регистра сведений НЕ только по измерениям, но и с отбором по реквизитам
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Во-первых, установить в наборе записей свойство Записывать.
Во-вторых, вызвать явно метод НаборЗаписей.Записать(Истина).
В-третьих, запрос, скорее всего, неверный: нет параметров отбора. Вы правда хотите загнать туда весь регистр сведений?
Во-первых, установить в наборе записей свойство Записывать.
Во-вторых, вызвать явно метод НаборЗаписей.Записать(Истина).
В-третьих, запрос, скорее всего, неверный: нет параметров отбора. Вы правда хотите загнать туда весь регистр сведений?
А если Вам просто выгрузить перенести весь регистр сведений с помощью стандартной обработки "Выгрузка и загрузка данных XML.epf" и не создавать документ операция, хотя всё равно нужно будет указать регистратор в записи по ОС.
Может лучше ручками заполнить документ Операция.
Может лучше ручками заполнить документ Операция.
Не очень понятно что вы хотитете сделать. НаборЗаписей в вашем коде это что?
Если вы про типовой документ типа ОперацияБух, тогда надо заполнить движения документа и записать их либо заполнять документ интерактивно. При этом регистратором будет сам документ операция.
Если вы про типовой документ типа ОперацияБух, тогда надо заполнить движения документа и записать их либо заполнять документ интерактивно. При этом регистратором будет сам документ операция.
(5)
Да типовой документ ОперацияБух. У меня на форме обработки поле ввода, там выбираю ДокументОперации у которого тип ДокументСсылка.ОперацияБух. И в выбранный документ операции надо записать данные регистра сведений СостоянияОСОрганизаций
Да типовой документ ОперацияБух. У меня на форме обработки поле ввода, там выбираю ДокументОперации у которого тип ДокументСсылка.ОперацияБух. И в выбранный документ операции надо записать данные регистра сведений СостоянияОСОрганизаций
Попробуйте так.
&НаСервере
Процедура ОбработатьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостоянияОСОрганизаций.Период,
| СостоянияОСОрганизаций.ОсновноеСредство,
| СостоянияОСОрганизаций.Организация,
| СостоянияОСОрганизаций.ДатаСостояния,
| СостоянияОСОрганизаций.Состояние
|ИЗ
| РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций";
ДокументОбъект = ДокументОперации.ПолучитьОбъект();
ДокументОбъект.Движения.СостоянияОСОрганизаций.Загрузить(Запрос.Выполнить().Выгрузить());
ДокументОбъект.Записать();
КонецПроцедуры
Показать
Только я насчет периода не уверен, можно ли в типовом документе записывать движения с периодом отличным от даты документа... А то придется создавать документы по каждому периоду.
Отладчик в помощь. Посмотреть что в результате запроса и обработчики событий записи операции - может там очищается что то.
Для теста можно попробовать следующее, так как есть подозрения, что в типовой при записи операции устанавливается отбор по периоду/регистратору (проверить сейчас негде).
&НаСервере
Процедура ОбработатьНаСервере()
ДокументОбъект = ДокументОперации.ПолучитьОбъект();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ОперацияСсылка", ДокументОбъект.Ссылка);
Запрос.УстановитьПараметр("ОперацияДата", ДокументОбъект.Дата);
Запрос.Текст =
"ВЫБРАТЬ
| &ОперацияДата КАК Период, // Можно попробовать оставить СостоянияОСОрганизаций.Период
| &ОперацияСсылка КАК Регистратор,
| СостоянияОСОрганизаций.ОсновноеСредство,
| СостоянияОСОрганизаций.Организация,
| СостоянияОСОрганизаций.ДатаСостояния,
| СостоянияОСОрганизаций.Состояние
|ИЗ
| РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций";
ДокументОбъект.Движения.СостоянияОСОрганизаций.Загрузить(Запрос.Выполнить().Выгрузить());
ДокументОбъект.Записать();
КонецПроцедуры
Показать
(16)
Все равно пусто.
Попробовал по-другому, заполняется только одна строка, потом ошибка, что запись с такими ключевыми полями существует.
Все равно пусто.
Попробовал по-другому, заполняется только одна строка, потом ошибка, что запись с такими ключевыми полями существует.
НаборЗаписей = РегистрыСведений.СостоянияОСОрганизаций.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументОперации);
НаборЗаписей.Прочитать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостоянияОСОрганизаций.Период,
| СостоянияОСОрганизаций.Регистратор,
| СостоянияОСОрганизаций.НомерСтроки,
| СостоянияОСОрганизаций.Активность,
| СостоянияОСОрганизаций.ОсновноеСредство,
| СостоянияОСОрганизаций.Организация,
| СостоянияОСОрганизаций.ДатаСостояния,
| СостоянияОСОрганизаций.Состояние,
| СостоянияОСОрганизаций.МоментВремени
|ИЗ
| РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = Выборка.Период;
НоваяЗапись.Регистратор = Выборка.Регистратор;
НоваяЗапись.ОсновноеСредство = Выборка.ОсновноеСредство;
НоваяЗапись.Активность = Выборка.Активность;
Новаязапись.Организация = Выборка.Организация;
НоваяЗапись.ДатаСостояния = Выборка.ДатаСостояния;
НоваяЗапись.Состояние = Выборка.Состояние;
НаборЗаписей.Записывать = истина;
НаборЗаписей.Записать();
КонецЦикла;
Показать
Тихий ужас.... Вы этим хотите заполнить движения регистра сведений где регистратор документ операция ?
(19) Тогда понятно, попробуйте только на тестовой плиз
Слепил быстро на коленке, выборка по первым 200, сами поправите.
&НаСервере
Процедура ОбработатьНаСервере(ДокументОперация)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 200
| СостоянияОСОрганизаций.Период,
| СостоянияОСОрганизаций.ОсновноеСредство,
| СостоянияОСОрганизаций.Организация,
| СостоянияОСОрганизаций.ДатаСостояния,
| СостоянияОСОрганизаций.Состояние
|ИЗ
| РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций";
ДокументОбъект = ДокументОперация.ПолучитьОбъект();
Организация = БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");
ДокументОбъект.Организация = Организация;
ДокументОбъект.Ответственный = Пользователи.ТекущийПользователь();
ДокументОбъект.ПометкаУдаления = Ложь;
ТекстСодержания = "Перенос данных ОС" ;
ДокументОбъект.Содержание = ТекстСодержания;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументОбъект.Ссылка, Истина);
Набор.Очистить();
Набор.Записать();
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
//Двигаем регистры
СтрокаРегистра = ДокументОбъект.ТаблицаРегистровСведений.Добавить();
СтрокаРегистра.Имя = "СостоянияОСОрганизаций";
ДокументОбъект.Движения.СостоянияОСОрганизаций.Записывать = Истина;
//Проверим на пустой запрос и сбросим
Если РезультатЗапроса.Пустой() Тогда
Сообщить("Нет ничего, ОШЫПКА :) !");
Возврат;
Иначе
Пока Выборка.Следующий() Цикл
////Заполняем проводки операции
Проводка = Набор.Добавить();
Проводка.Активность = Истина;
Проводка.Организация = Организация;
Проводка.Период = ДокументОперация.Дата;
////Делаем сторно по остаткам
СтрокаСостоянияОСОрганизаций = ДокументОбъект.Движения.СостоянияОСОрганизаций.Добавить();
СтрокаСостоянияОСОрганизаций.Активность = Истина;
СтрокаСостоянияОСОрганизаций.ДатаСостояния = Выборка.ДатаСостояния;
СтрокаСостоянияОСОрганизаций.Организация = Выборка.Организация;
СтрокаСостоянияОСОрганизаций.ОсновноеСредство = Выборка.ОсновноеСредство;
СтрокаСостоянияОСОрганизаций.Состояние = Выборка.Состояние;
КонецЦикла;
//В запись документ.
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Сделано !");
КонецЕсли;
КонецПроцедуры
ПоказатьСлепил быстро на коленке, выборка по первым 200, сами поправите.
(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
тут и возникает ошибка Запись с такими ключевыми полями существует...
Проводка.Организация = Организация;
Проводка.Период = ДокументОперация.Дата;
В выборке же нет отбора по организации или периоду - следовательно в выборку попадут все данные регистра, например:
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) Действительно, Проводка это оказывается РБ тут - не заметил.
Ну ок.
А с периодом что будет при записи операции? РС вероятно с периодичностью по позиции регистратора.
Если в регистре такие записи
Регистратор1; Организация1; Состояние1
Регистратор2; Организация1; Состояние2
Регистратор3; Организация1; Состояние1
Потом, насколько я помню, при записи типового документа ОперацияБух были какие то обработки записываемых наборов, там организация не устанавливается из значения шапки документа?
Ну ок.
А с периодом что будет при записи операции? РС вероятно с периодичностью по позиции регистратора.
Если в регистре такие записи
Регистратор1; Организация1; Состояние1
Регистратор2; Организация1; Состояние2
Регистратор3; Организация1; Состояние1
Потом, насколько я помню, при записи типового документа ОперацияБух были какие то обработки записываемых наборов, там организация не устанавливается из значения шапки документа?
(28) Да конечно поменяет организацию по данным шапки, под многофирменный учет код ну явно не рассчитан, хотя можно добавить отбор в запрос по организации из реквизита шапки документа операция.
А период РС по дате документа станет,но разве не Дата из Состояние нам нужна.
А период РС по дате документа станет,но разве не Дата из Состояние нам нужна.
(29) Дата нам может и из состояния нужна, но при записи строк по операции строки будут следующими
РегистраторОперация; Организация1; Состояние1
РегистраторОперация; Организация1; Состояние2
РегистраторОперация; Организация1; Состояние1
Первая и последняя запись не будут вызывать ошибку Запись с такими ключевыми полями существует?
РегистраторОперация; Организация1; Состояние1
РегистраторОперация; Организация1; Состояние2
РегистраторОперация; Организация1; Состояние1
Первая и последняя запись не будут вызывать ошибку Запись с такими ключевыми полями существует?
(31)
Попробовал через срез последних, ошибок нет, но и скопировалось не все. Одно из ОС было сначала принято к учету, потом снято с учета. Скопировалось только снятие с учета. И в регистре сведений записалась эта операция с новым периодом. Видимо это не подойдет, т.к. мне скорее всего надо, чтобы период операции соответствовал ранее введенныым периодам. Наверное надо на каждый период создавать новую операцию и записывать туда данные этого периода, тогда я думаю проблем с дублями не будет?
Попробовал через срез последних, ошибок нет, но и скопировалось не все. Одно из ОС было сначала принято к учету, потом снято с учета. Скопировалось только снятие с учета. И в регистре сведений записалась эта операция с новым периодом. Видимо это не подойдет, т.к. мне скорее всего надо, чтобы период операции соответствовал ранее введенныым периодам. Наверное надо на каждый период создавать новую операцию и записывать туда данные этого периода, тогда я думаю проблем с дублями не будет?
Кстати намерено не указал на ОбменДанными.Загрузка = Истина , скажем так от греха подальше.
Ведь и даты и движения по фирмам будут "идеальны", у него ведь перенос данных будет.
Ведь и даты и движения по фирмам будут "идеальны", у него ведь перенос данных будет.
(32)
Попытался сделать с помощью Вашего кода, вроде бы получилось. Надеюсь, что правильно
Попытался сделать с помощью Вашего кода, вроде бы получилось. Надеюсь, что правильно
&НаСервере
Процедура ОбработатьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостоянияОСОрганизаций.Период КАК Период,
| СостоянияОСОрганизаций.Регистратор,
| СостоянияОСОрганизаций.НомерСтроки,
| СостоянияОСОрганизаций.Активность,
| СостоянияОСОрганизаций.ОсновноеСредство,
| СостоянияОСОрганизаций.Организация,
| СостоянияОСОрганизаций.ДатаСостояния,
| СостоянияОСОрганизаций.Состояние,
| СостоянияОСОрганизаций.МоментВремени
|ИЗ
| РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций
|
|УПОРЯДОЧИТЬ ПО
| Период";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
СтараяДата = "00010101";
Пока Выборка.Следующий() Цикл
Если Выборка.Период <> СтараяДата Тогда
СтараяДата = Выборка.Период;
Операция = Документы.ОперацияБух.СоздатьДокумент();
Организация = БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");
Операция.Организация = Организация;
Операция.Ответственный = Пользователи.ТекущийПользователь();
Операция.ПометкаУдаления = Ложь;
ТекстСодержания = "Перенос данных ОС";
Операция.Содержание = ТекстСодержания;
Операция.Дата = Выборка.Период;
Операция.Записать(РежимЗаписиДокумента.Запись);
СтрокаРегистра = Операция.ТаблицаРегистровСведений.Добавить();
СтрокаРегистра.Имя = "СостоянияОСОрганизаций";
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Операция.Ссылка, Истина);
Набор.Очистить();
Набор.Записать();
Операция.Движения.СостоянияОСОрганизаций.Записывать = Истина;
Регистрировать = Истина;
КонецЕсли;
Проводка = Набор.Добавить();
Проводка.Активность = Истина;
Проводка.Организация = Организация;
Проводка.Период = ДокументОперации.Дата;
СтрокаСостоянияОСОрганизаций = Операция.Движения.СостоянияОСОрганизаций.Добавить();
СтрокаСостоянияОСОрганизаций.Активность = Истина;
СтрокаСостоянияОСОрганизаций.ДатаСостояния = Выборка.ДатаСостояния;
СтрокаСостоянияОСОрганизаций.Организация = Выборка.Организация;
СтрокаСостоянияОСОрганизаций.ОсновноеСредство = Выборка.ОсновноеСредство;
СтрокаСостоянияОСОрганизаций.Состояние = Выборка.Состояние;
Операция.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Показать
Думаю надо не создавать вручную операцию, а создать программно по каждому периоду в РС с этми периодом и заполнить всеми записями этого периода.
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот