gifts2017

Замена значений в проводках по бухгалтерскому и в движениях по оперативному учету 1С 7.7 не перепроводя документа

Опубликовал ROM (ROM_1C) в раздел Обработки - Обработка документов

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

На авторство не претендую, но самому обработка понадобилась и долго искал как так сделать. Юзайте на здоровье....  

Это условие вставляем в процедуру  ОбработкаПроведения(Параметр). Параметр дописать обязательно!!!   

    Если _АдминПроведениеДокумента(Контекст,Параметр) =1 Тогда
        Возврат;
    КонецЕсли;

    Следующую часть  пишем в глобальной модуль...

//=================================================================
// Возвращает элемент из списка с разделителями по номеру
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Вход :    Стр - строка списка с разделителями
//               Номер - порядковый номер элемента (начиная с 1)
//             Разделитель - символ разделителя в списке
// Выход:   Содержимое элемента (строка)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Функция _ПолучитьЭлемент(Знач Стр,Номер,Разделитель="~") Экспорт
      КолВо=СтрЧислоВхождений(Стр,Разделитель);
      Если (НомерКолВо) Тогда
           Возврат "";
      КонецЕсли;
      Позиция1=1;
      Для Н=1 По КолВо Цикл
          Позиция2=Найти(Стр,Разделитель);
          _Стр=Сред(Стр,Позиция1,Позиция2-1);
          Если Н=Номер Тогда
              Возврат Сред(_Стр,?(Н=1,1,2),СтрДлина(_Стр));
          Иначе
              Стр=СокрЛ(СтрЗаменить(?(Н=1,"@"+Стр,Стр),
                                                       ?(Н=1,"@"+_Стр+Разделитель,_Стр+Разделитель),"@"));
          КонецЕсли;
      КонецЦикла;
КонецФункции

//ROM=================================================================
//    Административное проведение документа
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Вход :    Конт - контекст формы
//             СпМассивов - СписокЗначений наполненный ссылками на др. массивы
// Выход:   1 - выполнено, 0 - не выполнено
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Функция _АдминПроведениеДокумента(Конт,СпМассивов) Экспорт
    Если ТипЗначенияСтр(СпМассивов)<>"СписокЗначений" Тогда
        Возврат 0;
    КонецЕсли;

    Если ПустоеЗначение(СпМассивов.Получить("АдминПроведениеДокумента"))=1 Тогда
        Возврат 0;
    КонецЕсли;

    ШапкаДок=СпМассивов.Получить("DH");
    ТабЧастьДок=СпМассивов.Получить("DT");
    ТабРег=СпМассивов.Получить("RA");
    //===================================
    //ТабРег.ВыбратьСтроку();
    //===================================
    ТабБух=СпМассивов.Получить("1SOPER");
    СуммаОперации=СпМассивов.Получить("СуммаОперации");
    СодержаниеОперации=СпМассивов.Получить("СодержаниеОперации");
    флОчищать=Число(СпМассивов.Получить("флОчищатьДвижения"));
   
    // шапка
    Для Индекс=1 По ШапкаДок.РазмерСписка() Цикл
        ИДРекв="";
        ЗначРекв=ШапкаДок.ПолучитьЗначение(Индекс,ИДРекв);
        Конт.УстановитьАтрибут(ИДРекв,ЗначРекв);
    КонецЦикла;
   
    // таб.часть
    Конт.ЗагрузитьТабличнуюЧасть(ТабЧастьДок);
   
    // движения по регистрам (оперативный учет)
    Если флОчищать=1 Тогда
        Конт.ОчиститьДвижения();
    КонецЕсли;
    СпИстории=СоздатьОбъект("СписокЗначений");
    ИДКолонки="";Заголовок="";
    Для Индекс=1 По ТабРег.КоличествоСтрок() Цикл
        ТабРег.ПолучитьСтрокуПоНомеру(Индекс);
        Для Инд=1 По ТабРег.КоличествоКолонок() Цикл
            ИДКолонки=Инд;
            ИДКолонки=ТабРег.ПолучитьПараметрыКолонки(ИДКолонки,,,,Заголовок);
            Значение=ТабРег.ПолучитьЗначение(Индекс,ИДКолонки);
            ИДРег=_ПолучитьЭлемент(ИДКолонки,1,"_");
            ИДРекв=_ПолучитьЭлемент(ИДКолонки,2,"_");
           
           
            Если ИДРег="Движение" Тогда
               Если ПустоеЗначение(Значение)=0 Тогда
                  ТекРег = Конт.Регистр.ПолучитьАтрибут(ИДРекв);
                  Если Значение=1 Тогда
                  // остаточный регистр, движение приход
                     ТекРег.ДвижениеПриходВыполнить();
                  ИначеЕсли Значение=2 Тогда
                  // остаточный регистр, движение расход
                     ТекРег.ДвижениеРасходВыполнить();
                  ИначеЕсли Значение=3 Тогда
                  // оборотный регистр, движение
                     ТекРег.ДвижениеВыполнить();
                  КонецЕсли;
               КонецЕсли;
            ИначеЕсли ИДРег="История" Тогда
                СпИстории.Установить(ИДРекв,Значение);
                Если ИДРекв="Дата" Тогда
                    флЕстьПустые=0;
                    Для Ин=1 По СпИстории.РазмерСписка() Цикл
                        Если ПустоеЗначение(СпИстории.ПолучитьЗначение(Ин))=1 Тогда
                            флЕстьПустые=1;
                            Прервать;
                        КонецЕсли;
                    КонецЦикла;
                    Если флЕстьПустые=0 Тогда
                        Попытка
                            Конт.УстановитьРеквизитСправочника(СпИстории.Получить("Элемент"),СпИстории.Получить("Реквизит"),СпИстории.Получить("Значение"),СпИстории.Получить("Дата"));
                        Исключение
                            // для док-ов оперативного учета, значение устанавливается только на дату документа
                            Конт.УстановитьРеквизитСправочника(СпИстории.Получить("Элемент"),СпИстории.Получить("Реквизит"),СпИстории.Получить("Значение"),Конт.ДатаДок);
                        КонецПопытки;
                        СпИстории.УдалитьВсе();
                    КонецЕсли;
                КонецЕсли;
               
            Иначе 
                Попытка
                    ТекРег = Конт.Регистр.ПолучитьАтрибут(ИДРег);
                    ТекРег.УстановитьАтрибут(ИДРекв,Значение);
                Исключение
                    //Сообщить("  ");
                КонецПопытки;   
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
   
    // операция, проводки (бух. учет)
    Для Индекс=1 По ТабБух.КоличествоСтрок() Цикл
        ТабБух.ПолучитьСтрокуПоНомеру(Индекс);
        Конт.Операция.НоваяПроводка();
        Конт.Операция.Дебет.Счет = ТабБух.ДТ;
        Конт.Операция.Кредит.Счет = ТабБух.КТ;
        // субконто
        Если ПустоеЗначение(ТабБух.Субконто1ДТ)=0 Тогда
            Конт.Операция.Дебет.Субконто(1,ТабБух.Субконто1ДТ);
        КонецЕсли;
        Если ПустоеЗначение(ТабБух.Субконто2ДТ)=0 Тогда
            Конт.Операция.Дебет.Субконто(2,ТабБух.Субконто2ДТ);
        КонецЕсли;
        Если ПустоеЗначение(ТабБух.Субконто3ДТ)=0 Тогда
            Конт.Операция.Дебет.Субконто(3,ТабБух.Субконто3ДТ);
        КонецЕсли;
        Если ПустоеЗначение(ТабБух.Субконто1КТ)=0 Тогда
            Конт.Операция.Кредит.Субконто(1,ТабБух.Субконто1КТ);
        КонецЕсли;
        Если ПустоеЗначение(ТабБух.Субконто2КТ)=0 Тогда
            Конт.Операция.Кредит.Субконто(2,ТабБух.Субконто2КТ);
        КонецЕсли;                                    
        Если ПустоеЗначение(ТабБух.Субконто3КТ)=0 Тогда
            Конт.Операция.Кредит.Субконто(3,ТабБух.Субконто3КТ);
        КонецЕсли;                                    
        Конт.Операция.Сумма = ТабБух.Сумма;
        Если ПустоеЗначение(ТабБух.ДТ)=0 Тогда
               Если ТабБух.ДТ.Количественный=1 Тогда
                   Конт.Операция.Количество = ТабБух.Количество;
               КонецЕсли;
           ИначеЕсли ПустоеЗначение(ТабБух.КТ)=0 Тогда
              Если ТабБух.ДТ.Количественный=1 Тогда
                   Конт.Операция.Количество = ТабБух.Количество;
               КонецЕсли;
           Иначе // выбраны оба счета
               Если (ТабБух.ДТ.Количественный=1) или (ТабБух.ДТ.Количественный=1) Тогда
                   Конт.Операция.Количество = ТабБух.Количество;
               КонецЕсли;
           КонецЕсли;
           Конт.Операция.Валюта = ТабБух.Валюта;
           Конт.Операция.ВалСумма = ТабБух.ВалСумма;
        Для Инд=1 По Метаданные.РеквизитПроводки() Цикл
            ИД=Метаданные.РеквизитПроводки(Инд).Идентификатор;
            Конт.Операция.УстановитьАтрибут(ИД,ТабБух.ПолучитьЗначение(Индекс,ИД));
        КонецЦикла;

    КонецЦикла;
    Попытка
        Конт.Операция.СуммаОперации = СуммаОперации;
           Конт.Операция.Содержание = СодержаниеОперации;
        Конт.Операция.Записать();
    Исключение
        Возврат 0;
    КонецПопытки;
    Возврат 1;
КонецФункции

Скачать файлы

Наименование Файл Версия Размер
- 100
.1247380837 194,00Kb
07.10.14
100
.1247380837 194,00Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Епрст (Ёпрст) 13.07.09 08:22
Утомили одним и тем же :
>>>>>>>>>"не перепроводя документ"<<<<<<<<<<<<<<<

Откуда вы все берёте ЭТОТ БРЕД ???

Движения у регистра пишутся только ПРОВЕДЕНИЕМ документа и никак иначе.
Можно только руками поправить табличку движений/итогов или прямым запросом.

И еще, ваш алгоритм - именно ПЕРЕПРОВЕДЕНИЕ документа , просто регистр пишет движуху из переданного ТЗ/СЗ .

И идея вовсе не новая, посмотрите МОД, от pb, например.
А чтоб это работало, у документа должна быть снята галка "автоматическое удаление движений".

aleks_cons; +1 Ответить
2. Tiger77 (Tiger77) 13.07.09 16:52
Проводки можно корректировать не перепроводя документы. А вот регистры - нет...
aleks_cons; +1 Ответить
3. oleg oleg (legioner) 14.07.09 04:12
Старо и не интересно
aleks_cons; +1 Ответить
4. Александр Рытов (Арчибальд) 14.07.09 10:35
Вообще-то в Бух 7.7. регистров не наблюдается...
5. Ирина Нечаева (Arin) 29.09.11 18:13
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа