Технологическое перепроведение документов

26.05.10

Разработка - Универсальные функции

Многие программисты и сисадмины, работающие с 1С 7.7 иногда ловят себя на мысли: как было бы здорово, если бы регистры можно было бы редактировать так же просто, как и бухгалтерские операции. Несколько лет назад эта проблема стала для меня настолько важной, что пришлось начать искать пути для её решения...

При изучении материала Коррекция регистров вспомнился мой собственный опыт корректировки регистров уже проведенных документов.

В отличие от способа Владислава Цылёва, я не использовал корректирующие документы, так как исправлять нужно было сразу большую последовательность документов. Не пользовался я также и прямыми запросами – для этого мне элементарно не хватило знаний.

 Но всё по порядку:

Было это больше 5 лет назад. Началось всё с того, что начальство поручило мне автоматизировать работу вновь созданного Отдела альтернативной подписки на базе нашей уже работающей программы (1С 7.7 Самописная конфигурация, Оперативный и Бухгалтерский учет). Дело было новое и незнакомое – как работает подписка и что требуется для этого, не знали не только я, но и руководство. Просто нас с начальником созданного отдела поставили перед фактом: Всё должно работать!

В процессе решения этой задачи, на начальном этапе, пока в наших головах не сложилось правильное представление о том, что нам нужно, мне приходилось  многократно переделывать структуры регистров и документов, перепроводить документы в «боевой» базе, в том числе и в закрыто» периоде – резать, что называется, по живому. Бухгалтерия была недовольна и категорически запрещала нам пересчитывать итоги. Если проводки ещё можно было скорректировать, не перепроводя документы, то с регистрами я этого делать не мог.

Постепенно в голове сформировался механизм перепроведения документов без пересчёта регистров и проводок. Идея состояла в том, что нужно перед проведением документа считать его движения в таблицу, а при проведении из этой же таблицы загрузить. Между этими действиями, с таблицей можно делать всё что угодно: менять значения ячеек, пересчитывать выборочно её строки, добавлять туда движения новых регистров или удалять то, что перестало быть необходимым.

Я поделился своими мыслями с друзьями, и мне подсказали, что нечто подобное уже предлагалось фирмой 1С на одном из дисков ИТС. После непродолжительных поисков я нашёл пример под названием «Технологическое перепроведение». На его основе был создан и внедрен в нашей организации механизм «технологического перепроведения документов». Поскольку за основу были взяты разработки 1С, то никакого авторства я за собой не оставляю.

 Для заполнения движений и проводок документа используется функция глобального модуля глЗаполнитьДвижения().

 

Функция глЗаполнитьДвижения(Документ) Экспорт

   ДвиженияРегистров=СоздатьОбъект("СписокЗначений");

   Если ПустоеЗначение(Документ) = 1 Тогда

      Возврат 0;

   КонецЕсли;

   Док = СоздатьОбъект("Документ");

   Док.НайтиДокумент(Документ);

   Для ИндРег = 1 По Метаданные.Регистр() Цикл

      МДРегистр = Метаданные.Регистр(ИндРег);

      ДвиженияРегистра = СоздатьОбъект("ТаблицаЗначений");

      ДвиженияРегистра.НоваяКолонка("ВидДвижения", "Строка", 3);

      ДвиженияРегистра.НоваяКолонка("НомерСтрокиДок", "Число", 5);

      Для Инд = 1 По МДРегистр.Измерение() Цикл

         ДвиженияРегистра.НоваяКолонка(МДРегистр.Измерение(Инд).Идентификатор, МДРегистр.Измерение(Инд));

      КонецЦикла;

      Для Инд = 1 По МДРегистр.Ресурс() Цикл

         ДвиженияРегистра.НоваяКолонка(МДРегистр.Ресурс(Инд).Идентификатор, МДРегистр.Ресурс(Инд));

      КонецЦикла;

      Для Инд = 1 По МДРегистр.Реквизит() Цикл

         ДвиженияРегистра.НоваяКолонка(МДРегистр.Реквизит(Инд).Идентификатор, МДРегистр.Реквизит(Инд));

      КонецЦикла;

      Рег = СоздатьОбъект("Регистр." + МДРегистр.Идентификатор);     

      Рег.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());

      Пока Рег.ПолучитьДвижение() = 1 Цикл

         ДвиженияРегистра.НоваяСтрока();

         Стр = ДвиженияРегистра.КоличествоСтрок();

         ДвиженияРегистра.ВидДвижения = ?(Рег.Приход = 1, "+", "-");

         ДвиженияРегистра.НомерСтрокиДок = Рег.НомерСтроки();

         Для Инд = 1 По МДРегистр.Измерение() Цикл                                                               

            Имя = МДРегистр.Измерение(Инд).Идентификатор;                      

            ДвиженияРегистра.УстановитьЗначение(Стр, Имя, Рег.ПолучитьАтрибут(Имя));

         КонецЦикла;

         Для Инд = 1 По МДРегистр.Ресурс() Цикл

            Имя = МДРегистр.Ресурс(Инд).Идентификатор;                      

            ДвиженияРегистра.УстановитьЗначение(Стр, Имя, Рег.ПолучитьАтрибут(Имя));

         КонецЦикла;

         Для Инд = 1 По МДРегистр.Реквизит() Цикл

            Имя = МДРегистр.Реквизит(Инд).Идентификатор;                      

            ДвиженияРегистра.УстановитьЗначение(Стр, Имя, Рег.ПолучитьАтрибут(Имя));

         КонецЦикла;

      КонецЦикла;

      ДвиженияРегистров.Установить(МДРегистр.Идентификатор, ДвиженияРегистра);    

   КонецЦикла;               

   Операция = СоздатьОбъект("Операция");

   Если Операция.НайтиОперацию(Документ) = 1 Тогда

      ДвиженияРегистров.Установить("СуммаОперации", Операция.СуммаОперации);    

      ДвиженияРегистров.Установить("Содержание", СокрЛП(Операция.Содержание));    

      Проводки = СоздатьОбъект("ТаблицаЗначений");

      Проводки.НоваяКолонка("Дт", "Счет",,,, 5);

      Проводки.НоваяКолонка("СубкД1",,,,, 10);

      Проводки.НоваяКолонка("СубкД2",,,,, 10);

      Проводки.НоваяКолонка("СубкД3",,,,, 10);

      Проводки.НоваяКолонка("Кт", "Счет",,,, 5);

      Проводки.НоваяКолонка("СубкК1",,,,, 10);

      Проводки.НоваяКолонка("СубкК2",,,,, 10);

      Проводки.НоваяКолонка("СубкК3",,,,, 10);

      Проводки.НоваяКолонка("Количество", "Число", 5,,, 3);

      Проводки.НоваяКолонка("Сумма", "Число", 15, 2,, 6);

      Проводки.НоваяКолонка("СодержаниеПроводки", "Строка",,,, 10);

      Проводки.НоваяКолонка("НомерЖурнала", "Строка",,,, 4);

      Операция.ВыбратьПроводки();

      Пока Операция.ПолучитьПроводку() = 1 Цикл

         Проводки.НоваяСтрока();

         ТекСтр = Проводки.НомерСтроки;

         ОперДбСчет = Операция.Дебет.Счет;

         Проводки.Дт = ОперДбСчет;

         Если ОперДбСчет.КоличествоСубконто() > 0 Тогда

            Для ъ = 1 по ОперДбСчет.КоличествоСубконто() Цикл

               Проводки.УстановитьЗначение(ТекСтр, "СубкД" + ъ, Операция.Дебет.Субконто(ъ));

            КонецЦикла;

         КонецЕсли;

         ОперКтСчет = Операция.Кредит.Счет;

         Проводки.Кт = ОперКтСчет;

         Если ОперКтСчет.КоличествоСубконто() > 0 Тогда

            Для ъ = 1 по ОперКтСчет.КоличествоСубконто() Цикл

               Проводки.УстановитьЗначение(ТекСтр, "СубкК" + ъ, Операция.Кредит.Субконто(ъ));

            КонецЦикла;

         КонецЕсли;

         Проводки.Количество = Операция.Количество;

         Проводки.Сумма = Операция.Сумма;

         Проводки.СодержаниеПроводки = Операция.СодержаниеПроводки;

         Проводки.НомерЖурнала = Операция.НомерЖурнала;

      КонецЦикла;

      ДвиженияРегистров.Установить("Операция", Проводки);     

   КонецЕсли;

   ДвиженияРегистров.Установить("Вариант", "ТехнологическоеПерепроведение");

   Возврат ДвиженияРегистров;

КонецФункции

Для демонстрации результата выполнения функции я использую разработку глПоказать() многоуважаемого zorro, которой пользуюсь уже много лет. (Выражаю огромную благодарность её автору).

Вот так в ней выглядит список ДвиженияРегистров. В качестве значений этого списка – таблицы, повторяющие структуру регистров и содержащие движения регистра документом.

 spisok

 

 

Вот пример таблицы ОстаткиТоваров. Её структура копирует структуру регистра ОстаткиТоваров, кроме двух служебных колонок: ВидДвижения, и НомерСтрокиДок.

ostatki 

 

Если документ имеет бухпроводки, то они записываются в таблицу с названием Операция.

operacia 

Для реквизитов СуммаОперации и Содержание в этой таблице места не нашлось, и они занимают «особое» положение в списке значений ДвижениеРегистров.

Заполнение таблицы Операция сделано для того, чтобы контролировать проводки во время технологического перепроведения, и не обрабатывать документ дважды, фактически двумя способами. Ведь если уж мы всё равно его перепроводим, зачем дополнительно править операцию?

В глобальный модуль также нужно поместить процедуру глТехнологическоеПерепроведение(), назначение которой – проводить документ «из таблицы».

Процедура глТехнологическоеПерепроведение(Конт, ДвиженияРегистров)Экспорт         

   Для ИндРег = 1 По Метаданные.Регистр() Цикл

      МДРегистр = Метаданные.Регистр(ИндРег);

      ДвиженияРегистра = ДвиженияРегистров.Получить(МДРегистр.Идентификатор);

      Если ПустоеЗначение(ДвиженияРегистра) = 1 Тогда

         Продолжить;

      КонецЕсли;

      Рег = Конт.Регистр.ПолучитьАтрибут(МДРегистр.Идентификатор);     

      Для Стр = 1 По ДвиженияРегистра.КоличествоСтрок() Цикл

         Рег.ПривязыватьСтроку(ДвиженияРегистра.ПолучитьЗначение(Стр, "НомерСтрокиДок"));

         Для Инд = 1 По МДРегистр.Измерение() Цикл                                                               

            Имя = МДРегистр.Измерение(Инд).Идентификатор;                      

            ПрисвоитьЗначениеСТипом(Рег, Имя, МДРегистр.Измерение(Инд), ДвиженияРегистра.ПолучитьЗначение(Стр, Имя));

         КонецЦикла;

         Для Инд = 1 По МДРегистр.Ресурс() Цикл

            Имя = МДРегистр.Ресурс(Инд).Идентификатор;                      

            Рег.УстановитьАтрибут(Имя, ДвиженияРегистра.ПолучитьЗначение(Стр, Имя));

         КонецЦикла;

         Для Инд = 1 По МДРегистр.Реквизит() Цикл

            Имя = МДРегистр.Реквизит(Инд).Идентификатор;                      

            ПрисвоитьЗначениеСТипом(Рег, Имя, МДРегистр.Реквизит(Инд), ДвиженияРегистра.ПолучитьЗначение(Стр, Имя));

         КонецЦикла;

         Если МДРегистр.ТипРегистра = "Остатки" Тогда

            Если СокрЛП(ДвиженияРегистра.ПолучитьЗначение(Стр, "ВидДвижения")) = "+" Тогда

               Рег.ДвижениеПриходВыполнить();           

            Иначе

               Рег.ДвижениеРасходВыполнить();           

            КонецЕсли;

         Иначе

            Рег.ДвижениеВыполнить();           

         КонецЕсли;

      КонецЦикла;

   КонецЦикла;               

   Если ТипЗначенияСтр(ДвиженияРегистров.Получить("Операция")) = "ТаблицаЗначений" Тогда

      Опер = Конт.Операция;

      ДвиженияРегистра = ДвиженияРегистров.Получить("Операция");

      Для Стр = 1 По ДвиженияРегистра.КоличествоСтрок() Цикл

         Опер.НоваяПроводка();

         Опер.Дебет.Счет = ДвиженияРегистра.ПолучитьЗначение(Стр, "Дт");

         Если Опер.Дебет.Счет.КоличествоСубконто() > 0 Тогда

            Для ъ = 1 по Опер.Дебет.Счет.КоличествоСубконто() Цикл

               СубкД = ДвиженияРегистра.ПолучитьЗначение(Стр, "СубкД" + ъ);

               Опер.Дебет.Субконто(ъ, СубкД);

            КонецЦикла;

         КонецЕсли;

         Опер.Кредит.Счет = ДвиженияРегистра.ПолучитьЗначение(Стр, "Кт");

         Если Опер.Кредит.Счет.КоличествоСубконто() > 0 Тогда

            Для ъ = 1 по Опер.Кредит.Счет.КоличествоСубконто() Цикл

               СубкК = ДвиженияРегистра.ПолучитьЗначение(Стр, "СубкК" + ъ);

               Опер.Кредит.Субконто(ъ, СубкК);

            КонецЦикла;

         КонецЕсли;

         Если ПустоеЗначение(ДвиженияРегистра.ПолучитьЗначение(Стр, "Количество")) = 0 Тогда

            Опер.Количество = ДвиженияРегистра.ПолучитьЗначение(Стр, "Количество");

         КонецЕсли;

         Опер.Сумма = ДвиженияРегистра.ПолучитьЗначение(Стр, "Сумма");

         Опер.СодержаниеПроводки = ДвиженияРегистра.ПолучитьЗначение(Стр, "СодержаниеПроводки");

         Если ПустоеЗначение(ДвиженияРегистра.ПолучитьЗначение(Стр, "НомерЖурнала")) = 0 Тогда

            Опер.НомерЖурнала = ДвиженияРегистра.ПолучитьЗначение(Стр, "НомерЖурнала");

         КонецЕсли;

      КонецЦикла;

      Опер.СуммаОперации = ДвиженияРегистров.Получить("СуммаОперации");

      Опер.Содержание = ДвиженияРегистров.Получить("Содержание");

      Опер.Записать();           

   КонецЕсли;

КонецПроцедуры

В обработки проведения документов нужно добавить следующие строки:

 Процедура ОбработкаПроведения(Реж)

   Если ТипЗначенияСтр(Реж) = "СписокЗначений" Тогда

      Если Реж.Получить("Вариант") = "ТехнологическоеПерепроведение" Тогда

         глТехнологическоеПерепроведение(Контекст, Реж);

         Возврат;              

      КонецЕсли;

   КонецЕсли;

  

 

Теперь если при проведении документа «подсунуть» ему в качестве параметра список с движениями:  

    Док.Провести(0, ДвиженияРегистров);

, то с этими движениями он и проведётся.

Вот собственно говоря и всё. Хотя отдел альтернативной подписки успешно работает и «подписная компонента» в корпоративной базе 1С «функцикулирует», от использования технологического перепроведения мы не отказались. Периодически бывает нужно скорректировать движения документа вслед за менеджерами.

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

 

Процедура Выполнить()

   Если ВыбТов2=ВыбТов1 Тогда

      Сигнал(); Предупреждение("Товары не должны быть одинаковыми!",5);

      Возврат;

   КонецЕсли;

   Сообщить("Время начала обработки: " + ТекущееВремя(), "i");  

   Запрос = СоздатьОбъект("Запрос");

   ТекстЗапроса =

   "Период с НачДата по КонДата;

   |Товар = Регистр.ОстаткиТоваров.Товар;

   |Док = Регистр.ОстаткиТоваров.ТекущийДокумент;

   |Кол = Регистр.ОстаткиТоваров.Количество;

   |Функция КолПриход = Приход(Кол);

   |Функция КолРасход = Расход(Кол);

   |Группировка Док;

   |Условие(Товар = ВыбТов1);";

   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

      Предупреждение("Не вышло?"); Возврат;

   КонецЕсли;

   Й=0;

   Пока Запрос.Группировка(1) = 1 Цикл

      Зап=0;

      ДД = Запрос.Док; ДДВид=ДД.Вид();

      ТД = СоздатьОбъект("Документ." + ДДВид);

      ТД.НайтиДокумент(ДД);

      Если ТД.Проведен() = 1 Тогда

         ДвиженияРегистров = глЗаполнитьДвижения(ТД.ТекущийДокумент(), 1);

         Состояние(""+ТД);

         Если (ДДВид="НакладнаяПередачи") Тогда

            ТЗ=ДвиженияРегистров.Получить("ПередачаТовара");

            ТЗ.ВыбратьСтроки();

            Пока ТЗ.ПолучитьСтроку()=1 Цикл

               Если ТЗ.Товар=ВыбТов1 Тогда

                  ТЗ.Товар=ВыбТов2;

                  Зап=1;

               КонецЕсли;

            КонецЦикла;

         КонецЕсли;

         Если (ДДВид="ВозвратПоставщику") Тогда

            ТЗ=ДвиженияРегистров.Получить("Поставщики");

            ТЗ.ВыбратьСтроки();

            Пока ТЗ.ПолучитьСтроку()=1 Цикл

               Если ТЗ.Товар=ВыбТов1 Тогда

                  ТЗ.Товар=ВыбТов2;

                  Зап=1;

               КонецЕсли;

            КонецЦикла;

         КонецЕсли;

         Если (ДДВид="РасходнаяНакладная") Или (ДДВид="ВозвратнаяНакладная") Или (ДДВид="ПередачаТовара") Тогда

            ТЗ=ДвиженияРегистров.Получить("Оборот");

            ТЗ.ВыбратьСтроки();

            Пока ТЗ.ПолучитьСтроку()=1 Цикл

               Если ТЗ.Товар=ВыбТов1 Тогда

                  ТЗ.Товар=ВыбТов2;

                  Зап=1;

               КонецЕсли;

            КонецЦикла;

         КонецЕсли;

         ТЗ=ДвиженияРегистров.Получить("ОстаткиТоваров");

         ТЗ.ВыбратьСтроки();

         Пока ТЗ.ПолучитьСтроку()=1 Цикл

            Если ТЗ.Товар=ВыбТов1 Тогда

               ТЗ.Товар=ВыбТов2;

               Зап=1;

            КонецЕсли;

         КонецЦикла;

         ТЗ=ДвиженияРегистров.Получить("Операция");

         ТЗ.ВыбратьСтроки();

         Пока ТЗ.ПолучитьСтроку()=1 Цикл

            Если Лев(ТЗ.Дт,3)="41." Тогда

               Если ТЗ.СубкД1=ВыбТов1 Тогда

                  ТЗ.СубкД1=ВыбТов2;

                  Зап=1;

               КонецЕсли;

            КонецЕсли;

            Если Лев(ТЗ.Кт,3)="41." Тогда

               Если ТЗ.СубкК1=ВыбТов1 Тогда

                  ТЗ.СубкК1=ВыбТов2;

                  Зап=1;

               КонецЕсли;

            КонецЕсли;

         КонецЦикла;

         Если Зап=1 Тогда

            Попытка

               Й=Й+1;

               Сообщить("            "+Й+". " + ТД, "i");

               Если ТД.Провести(0, ДвиженияРегистров) = 0 Тогда

                  ОтменитьТранзакцию();

                  Сообщить("- Документ не перепроведён " + ДД, "!");

                  Прервать;

               КонецЕсли;

            Исключение

               Сообщить("-- " + ОписаниеОшибки(), "!!!");

               Прервать;

            КонецПопытки;

         КонецЕсли;  

      КонецЕсли;  

   КонецЦикла;

   Сообщить("Обработка завершена: " + ТекущееВремя() + " " + РазделительСтраниц, "i");  

   Сообщить("");

   Сигнал();

   Предупреждение("Готово!");

КонецПроцедуры 

 

Хочу отметить, что технологическое перепроведение проходит значительно быстрее обычного, т.к. предварительные расчеты не проводятся, а берутся сразу готовые результаты из таблицы.

 

Если требуется распечатать  движение регистра документа, можно использовать последовательность процедур глЗаполнитьДвижения() и глПоказать().

На основе этой методики мой бывший напарник сваял обработку для интерактивной правки движений документа:

obrabotka 

Чтобы при повторном проведении после исправления старые движения не восстанавливались, эту штуку использую совместно с обработкой Editrekv.ert Владислава Цилёва.

 

Ну вот наверное и всё, что я хотел сказать. Если будете использовать, то имейте ввиду, что при работе с бухпроводками процедуры глЗаполнитьДвижения() и глТехнологическоеПерепроведение () не сохраняют и не восстанавливают реквизиты Валюта, ВалСумма, Основание… Просто не используем мы их. Ну если до сюда дочитали, то добавить сами сможете :-)

 

См. также

Универсальные функции Программист Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    1371    14    user706545_kseg1971    0    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    2339    zhenyat    7    

8

Универсальные функции Программист Платформа 1С v7.7 Россия Бесплатно (free)

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    5138    Zoltan_Black    11    

2

Универсальные функции Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13933    4    alsen    3    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10767    malovandrey    7    

19

Универсальные функции Работа с интерфейсом Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.

1 стартмани

27.09.2016    18887    2    HAMMER_59    6    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. lmm 14 22.01.09 20:49 Сейчас в теме
Приношу свои извинения за несколько сумбурное описание, но это моя первая статья на Infostart
AlexandrSmith; +1 Ответить
2. Altair777 645 22.01.09 20:58 Сейчас в теме
(0) пытался читать, не осилил.
День был тяжелый, устал - работа навалилась.
Но, имхо, плюсик заслуживаешь хотя бы только за подачу материала.
Но попытаюсь позже разобраться.
Если что, плюсик плавным движением и кликом мышки превращается... превращается... превращается... в.. :-)
3. CheBurator 2712 22.01.09 21:37 Сейчас в теме
не уловил - в чем основное назначение такого "перепроведения"? то что движения регистра не рассчитываются "штатным" алгоритмом, а берутся уже готовые "старые" движения и немного подправляются? что будет с итогами, если после вашего "технологического перепроведения" будет осуществлена штатная "восстановление последовательност"? итоги - что с ними будет?
5. lmm 14 23.01.09 08:21 Сейчас в теме
(3)В том то и дело, что изменения в движениях требовались только для вновь созданных регистров.(конфа то самописная, и новые регистры постоянно правились, ну и обработка то админская -- не знаешь, не трогай;))
AlexandrSmith; +1 Ответить
6. lmm 14 23.01.09 08:42 Сейчас в теме
(3)"Восстановлением последовательности" мы не пользуемся, поэтому что будет в этом случае, я сказать к сожалению не могу(
Наверное этот метод подходит не для всех случаев
AlexandrSmith; +1 Ответить
4. CheBurator 2712 22.01.09 21:51 Сейчас в теме
подсказка: если глПоказать сделать функцией, то ей можно будет пользоваться в отладчике очень удобно...
7. lmm 14 23.01.09 10:13 Сейчас в теме
Разумеется, чтобы в последущем при повторном перепроведении итоги "не поплыли", реквизиты документа тоже требуется исправить. Этот момент я в своём примере опустил.

В этом случае в моём примере перед заполнением движений документа в "таблицу" надо будет добавить строчки:

ТД.ВыбратьСтроки();
Пока ТД.ПолучитьСтроку() = 1 Цикл
Если ТД.Товар = ВыбТов1 Тогда
ТД.Товар = ВыбТов2;
ТД.Записать();
КонецЕсли;
КонецЦикла;
AlexandrSmith; +1 Ответить
8. lmm 14 23.01.09 10:46 Сейчас в теме
Процедура ПрисвоитьЗначениеСТипом, вызывается из глТехнологическоеПерепроведение():

Процедура ПрисвоитьЗначениеСТипом(Объект, Имя, МД, Значение) Экспорт
Если МД.Тип = "Неопределенный" Тогда
Тип = ТипЗначенияСтр(Значение);
Если Тип = "Перечисление" Тогда
Объект.НазначитьТип(Имя, Тип + "." + Значение.Вид());
ИначеЕсли Тип = "Число" Тогда
Стр = СокрЛП(Строка(Значение));
ПозТочки = Найти(Стр, ".");
Если ПозТочки > 0 Тогда
Объект.НазначитьТип(Имя, Тип, СтрДлина(Стр), СтрДлина(Стр) - ПозТочки);
Иначе
Объект.НазначитьТип(Имя, Тип, СтрДлина(Стр), 0);
КонецЕсли;
ИначеЕсли Тип = "Строка" Тогда
Объект.НазначитьТип(Имя, Тип, СтрДлина(Значение));
Иначе
Объект.НазначитьТип(Имя, Тип);
КонецЕсли;
КонецЕсли;
Объект.УстановитьАтрибут(Имя, Значение);
КонецПроцедуры

AlexandrSmith; +1 Ответить
9. Ёпрст 1065 23.01.09 11:41 Сейчас в теме
(0) Аналогичное решение сто лет в обед живёт в МОДе ...
12. lmm 14 23.01.09 13:41 Сейчас в теме
(9) не знал
(10-11) согласен
13. Ёпрст 1065 23.01.09 14:10 Сейчас в теме
(12) Будешь знать... Там сделано для того, чтобы можно было переносить документы вместе с движениями из базы в базу один в один ....
Или , если не переносить движения - они сами будут формироваться в базе приёмнике...
Ну и механизм тот же самый.

Вообще, часто используется, если надо допровести документ по каким-либо признакам..Добавить лишнее измерение, к примеру и т.д и т.п..
вещь очень полезная.
14. lmm 14 23.01.09 14:34 Сейчас в теме
(13) Вот последнее -- это самое интересное))) Можно двигать такие регистры, для которых этот документ изначально не был предназначен. Осталось придумать, как это использовать;)

А итоги пусть пересчитываются, лишь бы в процессе пересчета не менялись.
Вот только последовательности канешна нарушаются...
10. Ёпрст 1065 23.01.09 11:44 Сейчас в теме
+9 И самое главное автор забыл вообще сказать
11. Ёпрст 1065 23.01.09 11:45 Сейчас в теме
Что у документов должна быть снята галка "Автоматическое удаление движений"
И еще... пересчет итогов один хрен будет :)

А так, ничего нового.
15. slawa 26 17.04.09 05:52 Сейчас в теме
Не могу скачать глПоказать()
Все ссылки ведут на proclub, а там архив битый. (у меня есть право все качать)
скиньте пожалуйста show.zip на мыло gslawa(гав)gmail.com
Спасибо !!!

за статью +
16. apvl 26.08.09 15:10 Сейчас в теме
17. xxx6662000 26.05.10 11:06 Сейчас в теме
Было очень не плохо получить ссылку или саму обработку приведенную как пример. Ссылки на обработкой Editrekv.ert Владислава Цилёва, к сожалению ведут только в поиск где ни по имени ни по фамилии ни по названию обработки найти ничего не получается.
Если автор статьи сможет или другие пользователи имеющие данную обработку будьте добры вышлите мне на isn978@gmail.com
18. xxx6662000 26.05.10 11:25 Сейчас в теме
я столкнулся с технической проблемой при правке регистров обработкой "коррекция регистров". у нас сложный учет на 7.7. каждый день у нас открывается документом "открытие дня". задним числом проводить и перепроводить ничего нельзя. в этом документе задействованы три регистра и проводки, а править надо только одну запись в одном регистре из 10000 строк в каждом регистре и не затрагивая формирование операций. При использовании обработки время на корекцию занимает много, около 30 минут как минимум. А мне надо править за 2009 год около 200 документов - кошмар. Не подскажет ли автор правка регистров занимает меньше времени чем "коррекция регистров"?
19. lmm 14 26.05.10 14:00 Сейчас в теме
Скорректировал ссылку на обработку Editrekv.ert. Старая приказала долго жить ;)
21. isn 15 26.05.10 14:17 Сейчас в теме
(19) А ознакомится с обработкой, которую наваял Ваш бывший напарник для интерактивной правки движений документа, можно?
Я наверное не правильно выразился, я думал что "Editrekv.ert Владислава Цилёва" это обработка про которую Вы упоминали (которую наваял Ваш бывший напарник).
20. lmm 14 26.05.10 14:08 Сейчас в теме
isn2, как раз для таких целей эта технология и создавалась. Как я уже указал в статье, технологическое перепроведение проходит значительно быстрее обычного, т.к. предварительные расчеты не проводятся, а берутся сразу готовые результаты из таблицы. Насколько это быстрее, чем "коррекция регистров", я не знаю. Но это точно должно быть гораздо быстрее, чем реальное перепроведение этих 200 документов, поскольку 9999 строк из 10000 заново пересчитываться не будут.
22. lmm 14 26.05.10 15:02 Сейчас в теме
23. isn 15 26.05.10 15:27 Сейчас в теме
24. isn 15 26.05.10 15:35 Сейчас в теме
пока переписывался решил написать свою обработку для интерактивной правки движений документа.
Предлагаю Вам функцию аналогичную Вашей РедактированиеСтроки(Очистить = 0)
25. isn 15 26.05.10 15:36 Сейчас в теме
Там всего несколько строк и она универсальна, не зависимо от типа колонок позволяет присваивать требуемые значения
Процедура Клик(ТЗ)
перем Тип, НовоеЗначение;
ТЗ.ПолучитьПараметрыКолонки(ТЗ.ТекущаяКолонка(),Тип,,,,,,);
НовоеЗначение = ПолучитьПустоеЗначение(Тип);
Ответ = 0;
Ответ = ВвестиЗначение(НовоеЗначение,,,,Тип);
Если Ответ = 1 Тогда
ТЗ.УстановитьЗначение(ТЗ.ТекущаяСтрока(),ТЗ.ТекущаяКолонка(),НовоеЗначение);
КонецЕсли;
КонецПроцедуры // Клик()
26. isn 15 26.05.10 15:46 Сейчас в теме
жаль в работе не могу проверить отсутствуют процедуры
27. isn 15 26.05.10 15:46 Сейчас в теме
Посчитать (Контекст, "Обработка: ТехнологическоеПерепроведение");
глПечатьДвижений(Список,, 1);
28. lmm 14 18.12.11 14:11 Сейчас в теме
Спасибо всем за плюсики! Каждый из них для меня очень ценен, поэтому моя благодарность очень искренняя!
Жаль, что мало кому оказался полезным этот труд... Слишком уж специфическая работа!
Вот если какую-нибудь новую форму документа опубликовать -- это да!!! :)))))
Оставьте свое сообщение