Здравствуйте. 1С:Предприятие 8.2 (8.2.19.130) "Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.14.01)
Недавно внедрили этот продукт и пришлось задуматься о свертке базы в будущем, возможно даже делать это каждый год. Обратился к Рарус с этим вопросом - они предоставили обработку для свертки _СверткаИБ_АльфаАвто15122011_ansaru_10_09_2015. Попробовал запустить на копии, но обработки не работает, выдает кучу предупреждений и ошибку связанную со справочником Номенклатуры ГТД. Сообщил об этом в Рарус, на что они мне ответили, что "Относительно обработки сверки вынуждены констатировать, что использовать с украинской редакцией на текущий момент возможности нет." Думаю разбираться в ошибках данной обработки потребует слишком много времени.
Если я правильно понимаю принцип работы таких обработок, то это они копируют все справочники из базы донора в пустую базу, после чего переносят остатки товаров, взаиморасчетов, цены которые получаются запросом на конец указанной даты, и т.о. получается чистая база с такими же справочниками, с остатками, ценами, но уже без всех ненужных документов?
Скажите пожалуйста, а возможно-ли сделать такой ход и насколько будет это правильно?: Сделать копию базы, запустить в этой копии обработку, которая сделает выгрузку всех остатков товаров по складам, остатков взаиморасчетов по контрагентам и договорам, цен по типам цен во временные файлы, после чего установить у всех документов пометку на удаление, а в дальнейшем их удаление. Можно попробовать обойтись без временных файлов, а использовать OLE (ADO) подключение к базе донору (после удаления всех документов в копии) для получения всех этих остатков, цен и внесения данных. В завершении загрузить данные из временных файлов в базу.
Группа: Основатель
Сообщений: 13988
Из: Киев
Спасибо сказали: 4562 раз
Рейтинг: 3690.8
Получаете на какую-то дату нужные срезы (по товарам, по взаиморасчетам, по ценам и по всему что надо), формируете документы ввода остатков, а потом удаляете все документы до этой даты. Ну то есть зачем тут временные файлы непонятно.
Скажите пожалуйста, как это может помочь в данном случае?
Цитата(Vofka @ 16.09.16, 10:21)
Получаете на какую-то дату нужные срезы
Да я об этом думал, просто были сомнения, как можно будет результаты срезов поместить в ТЧ новых документов, обычным перебором результата и записи в ТЧ или все скопом. По поводу создания документов ввода остатков (и т.п.) и заполнением их срезом остатков - я Вас услышал, очень понравилась идея попробую сделать.
Группа: Основатель
Сообщений: 13988
Из: Киев
Спасибо сказали: 4562 раз
Рейтинг: 3690.8
Цитата(bizisoft @ 16.09.16, 12:00)
Да я об этом думал, просто были сомнения, как можно будет результаты срезов поместить в ТЧ новых документов, обычным перебором результата и записи в ТЧ или все скопом.
Это уже второй вопрос, причем я так и не понял в чём конкретно. Но в случае с временными файлами вам придется делать то же самое плюс писать отдельно выгрузку и загрузку этих файлов.
Закончил данную обработку. Вот ключевые участки кода:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Процедура ПереносОстатков() СпрСклады = Справочники.СкладыКомпании.Выбрать(); Пока СпрСклады.Следующий() Цикл ВводОстатков = Документы.ВводОстатковТоваров.СоздатьДокумент(); ВводОстатков.Комментарий = "Перенос остатков при свертке ИБ"; ВводОстатков.СкладКомпании = СпрСклады.Ссылка; ВводОстатков.Автор = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя); ВводОстатков.Организация = Справочники.Организации.НайтиПоНаименованию("ГРАНД-АВТО"); ВводОстатков.ПодразделениеКомпании = Справочники.ПодразделенияКомпании.НайтиПоНаименованию("ГРАНД-АВТО"); ВводОстатков.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("АВТОСКЛАД"); ВводОстатков.ДоговорВзаиморасчетов = Справочники.ДоговорыВзаиморасчетов.НайтиПоКоду("ЦБ000001"); ВалютаДок = Справочники.Валюты.НайтиПоКоду("840"); КурсДок = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(пвДатаСвертки, Новый Структура("Валюта", ВалютаДок)); ВводОстатков.ВалютаДокумента = ВалютаДок; ВводОстатков.КурсДокумента = КурсДок.Курс; ВводОстатков.ХозОперация = Справочники.ХозОперации.ВводОстатковТоваров; ВводОстатков.Дата = КонецДня(пвДатаСвертки)+1; // Дата документа с начала дня следующего числа ВводОстатков.СтатьяОприходованияТМЦ = Справочники.СтатьиДоходовИРасходов.НайтиПоКоду("30003"); ТЧ = ВводОстатков.Товары; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиТоваровКомпанииОстатки.Номенклатура, | ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, | ОстаткиТоваровКомпанииОстатки.СкладКомпании |ИЗ | РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&Дата, ) КАК ОстаткиТоваровКомпанииОстатки |ГДЕ | ОстаткиТоваровКомпанииОстатки.СкладКомпании = &СкладКомпании"; Запрос.УстановитьПараметр("СкладКомпании", СпрСклады.Ссылка); Запрос.УстановитьПараметр("Дата", пвДатаСвертки); Выборка = Запрос.Выполнить().Выбрать(); ЭлементыФормы.Индикатор.МинимальноеЗначение = 0; ЭлементыФормы.Индикатор.МаксимальноеЗначение = Выборка.Количество(); ЭлементыФормы.Индикатор.Значение = 0; Пока Выборка.Следующий() Цикл НоваяСтрокаТЧ = ТЧ.Добавить(); НоваяСтрокаТЧ.Номенклатура = Выборка.Номенклатура; ВводОстатков.ОбработкаРеквизита("Товары.Номенклатура",НоваяСтрокаТЧ,); НоваяСтрокаТЧ.Количество = Выборка.КоличествоОстаток; ВводОстатков.ОбработкаРеквизита("Товары.Количество",НоваяСтрокаТЧ,); Отбор = Новый Структура("ТипЦен, Номенклатура"); Отбор.ТипЦен = ВводОстатков.ДоговорВзаиморасчетов.ТипЦенПокупки; // Какой тип цены Отбор.Номенклатура = Выборка.Номенклатура; // Для какой номенклатуры Цена = РегистрыСведений.Цены.СрезПоследних( пвДатаСвертки, Отбор); Для каждого стр из Цена Цикл НоваяСтрокаТЧ.Цена = стр.Цена; ВводОстатков.ОбработкаРеквизита("Товары.Цена",НоваяСтрокаТЧ,); КонецЦикла; ЭлементыФормы.Индикатор.Значение = ЭлементыФормы.Индикатор.Значение+1; ОбработкаПрерыванияПользователя(); КонецЦикла; ВводОстатков.Записать(); ЭлементыФормы.Индикатор.Значение = 0; КонецЦикла; КонецПроцедуры ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Процедура ПереносЦен() Для каждого СтрЦена из тпНастройкаЦен Цикл ДокИзмЦен = Документы.ИзменениеЦен.СоздатьДокумент(); ДокИзмЦен.ОбработкаЗаполнения(Неопределено); ДокИзмЦен.Комментарий = "Перенос цен при свертке ИБ"; ДокИзмЦен.Дата = КонецДня(пвДатаСвертки)+1; // Дата документа с начала дня следующего числа пвДатаСвертки; ДокИзмЦен.ХозОперация = Справочники.ХозОперации.УстановкаЦенКомпании; //Док.УстановитьНовыйНомер(); ДокИзмЦен.ДатаНачалаДействия = пвДатаСвертки; ДокИзмЦен.Организация = Справочники.Организации.НайтиПоНаименованию("ГРАНД-АВТО"); ДокИзмЦен.ПодразделениеКомпании = Справочники.ПодразделенияКомпании.НайтиПоНаименованию("ГРАНД-АВТО");; ДокИзмЦен.ТипЦен = СтрЦена.ТипЦены; ВалютаДок = Справочники.Валюты.НайтиПоКоду("840"); КурсДок = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(пвДатаСвертки, Новый Структура("Валюта", ВалютаДок)); ДокИзмЦен.ВалютаДокумента = ВалютаДок; ДокИзмЦен.КурсДокумента = КурсДок.Курс; ДокИзмЦен.РасчетЦенОт = 2; //Выставляем "От цен поставщика" //ДокИзмЦен.Поставщик = Справочники.Контрагенты.НайтиПоНаименованию("АВТОСКЛАД"); ТЧ = ДокИзмЦен.Товары; ОтборТипЦен = Новый Структура("ТипЦен", СтрЦена.ТипЦены); тзДанные = РегистрыСведений.Цены.СрезПоследних(пвДатаСвертки, ОтборТипЦен); ЭлементыФормы.Индикатор.МинимальноеЗначение = 0; ЭлементыФормы.Индикатор.МаксимальноеЗначение = тзДанные.Количество(); ЭлементыФормы.Индикатор.Значение = 0; Для Каждого Стр Из тзДанные Цикл НайденнаяСтрока = ТЧ.Найти(Стр.Номенклатура,"Номенклатура"); Если НайденнаяСтрока = Неопределено Тогда СтрокаТоваров= ТЧ.Добавить(); СтрокаТоваров.Номенклатура = Стр.Номенклатура; ДокИзмЦен.ОбработкаРеквизита("Товары.Номенклатура",СтрокаТоваров,); КонецЕсли; ЭлементыФормы.Индикатор.Значение = ЭлементыФормы.Индикатор.Значение+1; КонецЦикла; ДокИзмЦен.Записать(); ЭлементыФормы.Индикатор.Значение = 0; КонецЦикла; КонецПроцедуры ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Процедура ПереносВзаиморасчетов() СпрВалюты = Справочники.Валюты.Выбрать(); Пока СпрВалюты.Следующий() Цикл ДокВзаиморасч = Документы.ВводОстатковВзаиморасчетов.СоздатьДокумент(); ДокВзаиморасч.Комментарий = "Перенос цен при свертке ИБ"; ДокВзаиморасч.Организация = Справочники.Организации.НайтиПоНаименованию("ГРАНД-АВТО");; ДокВзаиморасч.ПодразделениеКомпании = Справочники.ПодразделенияКомпании.НайтиПоНаименованию("ГРАНД-АВТО");;; ДокВзаиморасч.ВалютаДокумента = СпрВалюты.Ссылка; ДокВзаиморасч.Дата = КонецДня(пвДатаСвертки)+1; // Дата документа с начала дня следующего числа пвДатаСвертки; ДокВзаиморасч.Автор = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя); ДокВзаиморасч.РегламентированныйУчет = Истина; КурсДок = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(пвДатаСвертки, Новый Структура("Валюта", СпрВалюты.Ссылка)); ДокВзаиморасч.КурсДокумента = КурсДок.Курс; ДокВзаиморасч.ХозОперация = Справочники.ХозОперации.ВводОстатковВзаиморасчетов; ТЧ = ДокВзаиморасч.Состав; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВзаиморасчетыКомпанииОстаткиИОбороты.Контрагент КАК Контрагент, | ВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорВзаиморасчетов КАК ДоговорВзаиморасчетов, | ВзаиморасчетыКомпанииОстаткиИОбороты.Сделка КАК Сделка, | ВзаиморасчетыКомпанииОстаткиИОбороты.СуммаКонечныйОстаток КАК Сумма, | ВзаиморасчетыКомпанииОстаткиИОбороты.СуммаУпрКонечныйОстаток КАК СуммаУпр, | ВзаиморасчетыКомпанииОстаткиИОбороты.СуммаБазКонечныйОстаток КАК СуммаБаз |ИЗ | РегистрНакопления.ВзаиморасчетыКомпании.ОстаткиИОбороты(, &Дата, , , ) КАК ВзаиморасчетыКомпанииОстаткиИОбороты |ГДЕ | ВзаиморасчетыКомпанииОстаткиИОбороты.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов = &ВалютаВзаиморасчетов"; Запрос.УстановитьПараметр("Дата", пвДатаСвертки); Запрос.УстановитьПараметр("ВалютаВзаиморасчетов",СпрВалюты.Ссылка); Результат = Запрос.Выполнить(); ТЗ = Новый ТаблицаЗначений; ОписаниеКонтрагента = Новый ОписаниеТипов("СправочникСсылка.Контрагенты"); ОписаниеДоговорВзаиморасчетов = Новый ОписаниеТипов("СправочникСсылка.ДоговорыВзаиморасчетов"); ОписаниеСтроки = Новый ОписаниеТипов("Строка"); ОписаниеСуммы = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 3)); ТЗ.Колонки.Добавить("Контрагент",ОписаниеКонтрагента); ТЗ.Колонки.Добавить("ДоговорВзаиморасчетов",ОписаниеДоговорВзаиморасчетов); ТЗ.Колонки.Добавить("Сделка",ОписаниеСтроки); ТЗ.Колонки.Добавить("Сумма",ОписаниеСуммы); ТЗ.Колонки.Добавить("СуммаУпр",ОписаниеСуммы); ТЗ.Колонки.Добавить("СуммаБаз",ОписаниеСуммы); ТЗ = Результат.Выгрузить(); ТЗ.Свернуть("Контрагент, ДоговорВзаиморасчетов" ,"Сумма, СуммаУпр, СуммаБаз"); ЭлементыФормы.Индикатор.МинимальноеЗначение = 0; ЭлементыФормы.Индикатор.МаксимальноеЗначение = ТЗ.Количество(); ЭлементыФормы.Индикатор.Значение = 0; Для каждого стр из ТЗ Цикл Сумма = ?(ПустаяСтрока(стр.Сумма), 0, стр.Сумма); Если Сумма > 0 Тогда СтрокаТоваров= ТЧ.Добавить(); СтрокаТоваров.Контрагент = Стр.Контрагент; ДокВзаиморасч.ОбработкаРеквизита("Состав.Контрагент",СтрокаТоваров,); СтрокаТоваров.ДоговорВзаиморасчетов = Стр.ДоговорВзаиморасчетов; ДокВзаиморасч.ОбработкаРеквизита("Состав.ДоговорВзаиморасчетов",СтрокаТоваров,); СтрокаТоваров.СуммаДебет = Сумма; ИначеЕсли Сумма < 0 Тогда СтрокаТоваров= ТЧ.Добавить(); СтрокаТоваров.Контрагент = Стр.Контрагент; ДокВзаиморасч.ОбработкаРеквизита("Состав.Контрагент",СтрокаТоваров,); СтрокаТоваров.ДоговорВзаиморасчетов = Стр.ДоговорВзаиморасчетов; ДокВзаиморасч.ОбработкаРеквизита("Состав.ДоговорВзаиморасчетов",СтрокаТоваров,); СтрокаТоваров.СуммаКредит = Макс(-Сумма, Сумма); КонецЕсли; ЭлементыФормы.Индикатор.Значение = ЭлементыФормы.Индикатор.Значение+1; КонецЦикла; ДокВзаиморасч.Записать(); ЭлементыФормы.Индикатор.Значение = 0; КонецЦикла; КонецПроцедуры ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Процедура УстановкаПометкиУдаления() Запрос = Новый Запрос; ФлагПервыйВход = Истина; Запрос.Текст = "ВЫБРАТЬ ВложенныйЗапрос.Ссылка ИЗ ("; Для каждого Док из Метаданные.Документы Цикл Если НЕ ФлагПервыйВход Тогда Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ "; КонецЕСли; ФлагПервыйВход = Ложь; Запрос.Текст = Запрос.Текст + " ВЫБРАТЬ Ссылка ИЗ Документ." + Док.Имя + " ГДЕ Дата МЕЖДУ &НачДата и &КонДата "; КонецЦикла; Запрос.Текст = Запрос.Текст + ") КАК ВложенныйЗапрос УПОРЯДОЧИТЬ ПО ВложенныйЗапрос.Ссылка.Дата"; Запрос.УстановитьПараметр("НачДата", НачалоГода(пвДатаСвертки)); Запрос.УстановитьПараметр("КонДата", пвДатаСвертки); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); ЭлементыФормы.Индикатор.МинимальноеЗначение = 0; ЭлементыФормы.Индикатор.МаксимальноеЗначение = Выборка.Количество(); ЭлементыФормы.Индикатор.Значение = 0; Пока Выборка.Следующий() Цикл ЭлементыФормы.Индикатор.Значение = ЭлементыФормы.Индикатор.Значение+1; Попытка Объект = Выборка.Ссылка.ПолучитьОбъект(); Объект.УстановитьПометкуУдаления(Истина); Объект.Записать(); Исключение Сообщить("Ошибка установки пометки удаления: "+Выборка.Ссылка); КонецПопытки; ОбработкаПрерыванияПользователя(); КонецЦикла; ЭлементыФормы.Индикатор.Значение = 0; КонецПроцедуры
Насколько такой способ верный, т.к. первые тестирования показали, что вроде все работает и полученные в итоге цифры похожи на правду? Может быть стоит что-нибудь еще учесть?
Направление правильное. По реализации: 1.Остатки - сразу запрос с итогами по складу, потом перебор. Цены сразу прицепить в запросе. 2.Цены- один запрос на дату и обход результата. 3.Взаиморасчеты - группировать в запросе (не надо там временной тз). по всем - выходные поля запроса называть так, как колонки в документе, потом ЗаполнитьЗначения... 4.Установка пометки - если много документов - задолбаетесь ждать конца. Поэтому и был совет по поводу РИБ.
sava1 @ 05.10.16, 12:20
, 1 и 2. Используются несколько типов цен ЗАКУПКА, ОПТ, ОПТ1, РОЗН, соответственно формируется 4 документа Установка цен компании, В настоящий момент эти документы заполняются как Расчет от цен поставщика, но возможно потребуется расчет по цепочке от базовой: ЗАКУПКА-ОПТ-ОПТ1-РОЗН (не знаю что стукнет пользователям), поэтому выполняю запросы по каждому типу цены отдельно. 3. Использую временную ТЗ только для того, чтобы свернуть результат по Контрагенту и Договору.
Относительно ЗаполнитьЗначения надо попробовать - не знал что этот метод применим в таких случаях. Он быстрее работает?
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!