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



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

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

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

    Если _АдминПроведениеДокумента(Контекст,Параметр) =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;
КонецФункции

5 Comments

  1. Ёпрст

    Утомили одним и тем же :

    >>>>>>>>>»не перепроводя документ»<<<<<<<<<<<<<<<

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

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

    Можно только руками поправить табличку движений/итогов или прямым запросом.

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

    И идея вовсе не новая, посмотрите МОД, от pb, например.

    А чтоб это работало, у документа должна быть снята галка «автоматическое удаление движений».

    Reply
  2. Tiger77

    Проводки можно корректировать не перепроводя документы. А вот регистры — нет…

    Reply
  3. legioner

    Старо и не интересно

    Reply
  4. Арчибальд

    Вообще-то в Бух 7.7. регистров не наблюдается…

    Reply
  5. Arin

    спасибо!!!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *