Прямое редактирование движений регистров и перепроведение документов по выбранным регистрам в 1С 7.7

15.06.17

Задачи пользователя - Корректировка данных

Механизм позволит вручную исправлять любые реквизиты документов, свободно редактировать любые значения в регистрах. Также проводить документы по некоторым регистрам, а не по всем, предусмотренным в обработке проведения - для ускорения перепроведения документов.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Управление содержимым документа
.ert 217,00Kb
55
55
3 SM
Скачать Купить за 2 450 руб.

Предистория:

Запускал торговую систему в нашем филиале в Казахстане (до этого система уже работала в Украине и России). И во время переноса движений из старой базы в новую, постоянно сталкивался с проблемой несоответствия движений регистров из-за ошибок в старой базе. В конце концов, пришлось создать не только обработку, которая позволила произвольно редактировать содержимое регистров и реквизитов документа, но и механизм проведения документов по выбранным регистрам. Благо, что конфигурация создавалась с нуля и не нужно было втискиваться в рамки типовой конфигурации.

Проверялось на релизе:

1С 7.7.27, 1С++ 2.0.3.7, установлен MS Office с ActiveX компонентой MSComctlLib.TreeCtrl или наличие компоненты COMCTL.TreeCtrl (для навигации в виде дерева).

Что делает обработка и механизм:

Позволяет произвольно редактировать реквизиты шапки и табличной части документа, редактировать любые значения в регистрах документа. Также предлагается механизм для группового перепроведения документов по выбранным регистрам - очень полезная штука, когда нужно быстро перепровести документы за период и нет желания тратить время на выполнение расчетов по всем регистрам. Например, перепровести документы только по товарным регистрам, а взаиморасчеты не трогать.

Кому будет интересна:

Сразу запустить обработку не получится - в этой статье предлагается конструктор. Необходима модификация как кода обработки, так и кода конфигурации. Если Вы готовы пойти на этот шаг, тогда она для Вас. Учтите, что обработка создавалась для редактирования регистров оперативного учёта.

Что нужно будет поменять в конфигурации:

  1. Для всех документов конфигурации необходимо снять признак "Автоматическое удаление движений".
  2. Исправить во всех документах процедуру ОбработкаПроведения
  3. Ввести в систему понятие "участок": включает в себя набор логически связанных регистров, движения которых взаимосвязаны и раздельное проведение может вызвать логичские разногласия. Например, для ТиС это может быть регистр Остатки и Партии. Участки определяются в глобальной переменной.
  4. Модифицировать глобальный модуль для встраивания служебных процедур и функций, а также модифицировать существующие процедуры записи движений в регистры.

Подробности:

Чтобы запустить механизм прямого редактирования реквизитов документов, никаких изменений в конфигурации не нужно. Обработка просто считывает реквизиты в таблицы значений и после внесения изменений и подтверждения сохранения, записывает новые значения с помощью метода Записать().

А вот для редактирования движений регистров уже нужна модификация конфигурации. Нужно в режиме конфигуратора для документов снять признак "Автоматическое удаление движений" и модифицировать процедуру ОбработкаПроведения. Идея заключается в том, чтобы считать движения регистров в таблицу значений. После интерактивного редактирования таблицы, запустить процедуру ОбработкаПроведения документа с параметром типа ТаблицаЗначений, в котором будет передана таблица значений с исправленным содержимым регистров. Дальше исправленная процедура проведения будет записывать движения в регистр из переданной таблицы значений, а не выполнять расчет новых значений регистров, как это предусмотренно в обычном механизме проведения документа.

Для перепроведения документов по избранным участкам учёта, понадобится отдельная обработка, в которой можно указать участки для проведения. Обработка будет передавать в процедуру ОбработкаПроведения() параметр типа СписокЗначений. Этот параметр будет содержать список участков, по которым нужно перепроведение.

Необходимые изменения в конфигурации:

1. Добавить глобальную переменную для определения участков (групп регистров, которые проводятся всегда совместно) и инициализировать её 

глСоставРегистровПоУчасткам = СоздатьОбъект("СписокЗначений");
глСоставРегистровПоУчасткам.ДобавитьЗначение("ПартииНаличие" , "Товары" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("РезервыТоваров" , "Товары" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("РезервыКонтрагентов" , "Товары" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("ПартииКорректировка" , "Товары" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("ОстаткиМОЛ" , "Товары" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("ОстаткиВКамерах" , "Товары" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("РасходыНаТовары" , "Расходы на товары");
глСоставРегистровПоУчасткам.ДобавитьЗначение("Покупатели" , "Взаиморасчеты" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("Поставщики" , "Взаиморасчеты" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("Касса" , "Деньги" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("Банк" , "Деньги" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("ОплатыДоговоров" , "Деньги" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("Факторинг" , "Деньги" );
глСоставРегистровПоУчасткам.ДобавитьЗначение("ИсполнениеПриказов" , "Приказы" );

2. Изменить во всех документах процедуру ОбработкаПроведения - добавить параметр ВидыДвижений

Процедура ОбработкаПроведения(ВидыДвижений="")

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

// тар - при проведении из таблицы значений не должно выполняться никаких проверок на корректность данных
спУправлениеПроведением = СоздатьОбъект("СписокЗначений");
Если ТипЗначенияСтр(ВидыДвижений) = "ТаблицаЗначений" Тогда
   Если глУправлениеПроведениемДокумента(Контекст, ВидыДвижений, спУправлениеПроведением) = 0 Тогда
      Возврат;
   КонецЕсли;
КонецЕсли;

Таблица значений с содержимым регистров содержит в себе названия регистров и вложенные таблицы с содержимым регистров

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

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

4. Добавить в глобальный модуль процедуру глУправлениеПроведениемДокумента, которая определит по каким участкам нужно проводить регистры и очистит движения регистров если тип параметра ВидДвижений - СписокЗначений или есть ТаблицаЗначений - заменит движения регистров данными из таблицы значений.

// ====================================
// тар - вызывается из ОбработкиПроведения документа
// очищает содержимое регистров или если передан РежимПроведения как ТаблицаЗначений,
// то проводит документ по этим регистрам
// возвращает 1 - когда нужно в обработке проведения передать управление дальше и проводить регистры
// и 0 - когда дальше проводить не нужно
Функция глУправлениеПроведениемДокумента(Конт, ВидыДвижений, СписокПараметров) Экспорт
Перем Рез;

Рез = 1;
ПровестиТовары = 1;
ПровестиРасходыНаТовары = 1;
ПровестиВзаиморасчеты = 1;
ПровестиДеньги = 1;
ПровестиПриказы = 1;
Перепроведение = 0;

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

ПровестиТовары = 0;
ПровестиВзаиморасчеты = 0;
ПровестиДеньги = 0;
ПровестиРасходыНаТовары = 0;
ПровестиПриказы = 0;

Перепроведение = 1;

Для у = 1 По ВидыДвижений.РазмерСписка() Цикл
ТекУчасток = ВидыДвижений.ПолучитьЗначение(у);
Если ТекУчасток = "Товары" Тогда
ПровестиТовары = 1
ИначеЕсли ТекУчасток = "Взаиморасчеты" Тогда
ПровестиВзаиморасчеты = 1
ИначеЕсли ТекУчасток = "Деньги" Тогда
ПровестиДеньги = 1
ИначеЕсли ТекУчасток = "Расходы на товары" Тогда
ПровестиРасходыНаТовары = 1
ИначеЕсли ТекУчасток = "Приказы" Тогда
ПровестиПриказы = 1
КонецЕсли;
КонецЦикла;

ИначеЕсли ТипРП = "ТаблицаЗначений" Тогда

глПровестиПоТаблицеЗначений(Конт, ВидыДвижений);
Рез = 0;
Возврат Рез; // т.к. по переданным регистрам уже все проведено

ИначеЕсли ТипРП = "Строка" Тогда
Если НРег(ВидыДвижений) = "перепроведение" Тогда
Перепроведение = 1;
КонецЕсли;
КонецЕсли;

// тар - т.к. отменено автоматическое удаление движений
спОчищаемыеРегистры = СоздатьОбъект("СписокЗначений");
Для Номер = 1 По Метаданные.Регистр() Цикл
УдалитьДвиженияРегистра = 1;
ИдРегистра = Метаданные.Регистр(Номер).Идентификатор;

ТекУчасток = "";
поз = глСоставРегистровПоУчасткам.НайтиЗначение(ИдРегистра);
Если поз > 0 Тогда
глСоставРегистровПоУчасткам.ПолучитьЗначение(поз, ТекУчасток);
КонецЕсли;

Если (ПровестиТовары = 0) И (ТекУчасток = "Товары") Тогда
УдалитьДвиженияРегистра = 0;
КонецЕсли;
Если (ПровестиВзаиморасчеты = 0) И (ТекУчасток = "Взаиморасчеты") Тогда
УдалитьДвиженияРегистра = 0;
КонецЕсли;
Если (ПровестиДеньги = 0) И (ТекУчасток = "Деньги") Тогда
УдалитьДвиженияРегистра = 0;
КонецЕсли;
Если (ПровестиРасходыНаТовары = 0) И (ТекУчасток = "Расходы на товары") Тогда
УдалитьДвиженияРегистра = 0;
КонецЕсли;
Если (ПровестиПриказы = 0) И (ТекУчасток = "Приказы") Тогда
УдалитьДвиженияРегистра = 0;
КонецЕсли;

Если УдалитьДвиженияРегистра = 1 Тогда
Конт.ОчиститьДвижения("Регистр." + ИдРегистра);
спОчищаемыеРегистры.ДобавитьЗначение(ИдРегистра);
КонецЕсли;

КонецЦикла; // тар

// тар
Если (Перепроведение = 1) И (ТипЗначенияСтр(ВидыДвижений) = "СписокЗначений") Тогда
//глСообщить("Очищаются регистры:" + спОчищаемыеРегистры.ВСтрокуСРазделителями(), "i");
КонецЕсли; // тар

СписокПараметров.Установить("ПровестиТовары" , ПровестиТовары );
СписокПараметров.Установить("ПровестиРасходыНаТовары" , ПровестиРасходыНаТовары );
СписокПараметров.Установить("ПровестиВзаиморасчеты" , ПровестиВзаиморасчеты );
СписокПараметров.Установить("ПровестиДеньги" , ПровестиДеньги );
СписокПараметров.Установить("ПровестиПриказы" , ПровестиПриказы );

СписокПараметров.Установить("Перепроведение" , Перепроведение );

Возврат Рез;

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

5. Если ВидДвижений - СписокЗначений, запустить в ОбработкеПроведения механизм очистки содержимого регистров, которые будут перепроводится и не трогать регистры, которые проводиться не будут

Если глУправлениеПроведениемДокумента(Контекст, ВидыДвижений, спУправлениеПроведением) = 0 Тогда
Возврат;
Иначе
ПровестиТовары = спУправлениеПроведением.Получить("ПровестиТовары");
ПровестиРасходыНаТовары = спУправлениеПроведением.Получить("ПровестиРасходыНаТовары");
ПровестиВзаиморасчеты = спУправлениеПроведением.Получить("ПровестиВзаиморасчеты");
ПровестиДеньги = спУправлениеПроведением.Получить("ПровестиДеньги");

Перепроведение = спУправлениеПроведением.Получить("Перепроведение");
КонецЕсли; // тар

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

Если ПровестиТовары = 1 Тогда // участок - товары

ДвиженияПартии();
ДвиженияРезерв();

КонецЕсли;

Если ПровестиВзаиморасчеты = 1 Тогда

ДвиженияВзаиморасчеты();

КонецЕсли;

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

Функция Присвоить(Чему,Что) Экспорт
Чему = Что;
Возврат "";
КонецФункции

Процедура глПровестиПоТаблицеЗначений(Конт, ВидыДвижений) Экспорт

ВидыДвижений.ВыбратьСтроки();
Пока ВидыДвижений.ПолучитьСтроку() = 1 Цикл
ВидРегистра = СокрЛП(ВидыДвижений.Регистр);
ОпределениеРегистра = "Регистр." + ВидРегистра;
ТекРегистр = ВидыДвижений.ДвиженияРегистра;

Если НЕ(ТипЗначенияСтр(ТекРегистр) = "ТаблицаЗначений") Тогда
Продолжить
КонецЕсли;

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

Рег = 0;
СсылкаНаРегистр = "Конт." + ОпределениеРегистра;
Шаблон("[Присвоить(Рег, " + Шаблон("[СсылкаНаРегистр]") + ")]");

Для дв = 1 По ТекРегистр.КоличествоСтрок() Цикл
ТекРегистр.ПолучитьСтрокуПоНомеру(дв);
Для к = 1 По ТекРегистр.КоличествоКолонок() Цикл
ТекАтрибут = ТекРегистр.ПолучитьПараметрыКолонки(к);
ТекЗначениеАтрибута = ТекРегистр.ПолучитьЗначение(дв, к);
Если ТекАтрибут = "НомерСтрокиРегистра" Тогда
Если ТекЗначениеАтрибута > 0 Тогда
Рег.ПривязыватьСтроку(ТекЗначениеАтрибута);
КонецЕсли;
ИначеЕсли (ТекАтрибут = "НомерСтроки") ИЛИ (ТекАтрибут = "ФлагДвижения") Тогда
Продолжить
Иначе
Рег.УстановитьАтрибут(ТекАтрибут, ТекЗначениеАтрибута);
КонецЕсли;
КонецЦикла;
ФлагДвижения = ТекРегистр.ФлагДвижения;
Если ФлагДвижения = "+" Тогда
Рег.ДвижениеПриходВыполнить();
ИначеЕсли ФлагДвижения = "-" Тогда
Рег.ДвижениеРасходВыполнить();
Иначе
Рег.ДвижениеВыполнить();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

8. Добавить в конфигурацию обработку "Управление содержимым документа" из этой статьи

См. также

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

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

1 стартмани

13.05.2021    7986    11    etmarket    0    

3

Корректировка данных Акт сверки Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Управление торговлей 10 1С:Комплексная 7.7 1С:Торговля и склад 7.7 Россия Бухгалтерский учет Управленческий учет НДС Абонемент ($m)

Пример реализации сверок между базами и исправления расхождений в обе стороны, из 7.7 -> в 8.3 и из 8.3 -> в 7.7 на обычных формах. Фундаментальные обработки, которые работают на постоянной основе и поддерживают идентичность данных между базами основных поставщиков и основных покупателей (их соответствие прописано в модуле). Используется Новый COMОбъект("V77.Application"), пример использования внешнего источника данных. Реализация в поступление. Поступление в поступление. Корректировка поступления в корректировку отгрузки. СчФ выданный в СчФ полученный. Исправление СчФ полученного в исправление СчФ выданного. Перенос документа Реализация 7.7 в Поступление 8, Перемещение 7.7 в Поступление 8. Акт сверки взаиморасчетов (несколько организаций). Все обработки запускаются в базе 1С Предприятие 8 (обычные формы).

1 стартмани

03.10.2019    14808    31    ksnik    6    

4

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

Универсальная обработка 7.7, представленная здесь, до сих пор почему-то по функционалу гораздо беднее, чем общеизвестная типовая "Универсальный подбор и обработка объектов" (UNIREPS82\UniversalSelection) 8.2-8.3", мне не хватило возможности выполнить произвольный код обработчика объектов. Данная обработка "UChoice.ert" является полным аналогом "UniversalSelection", представляет собой консоль выполнения произвольного кода, позволяет делать с объектами информационной базы 1С 7.7 абсолютно все, что угодно, а не узкий, сложно настраиваемый набор команд, на мой взгляд, она существенно превосходит имеющиеся аналоги, поэтому ничем другим кроме нее я не пользуюсь.

1 стартмани

04.04.2019    16538    29    ksnik    9    

4

Корректировка данных Бухгалтер Бухгалтерский учет 7.7 1С:Упрощенное налогообложение 7.7 Россия Бухгалтерский учет НДС Абонемент ($m)

Для 1С:Предприятия 8 переход на НДС 20% сделан, а для 7.7 я не нашел. Выкладываю.

1 стартмани

24.12.2018    18631    34    pentanom    25    

5

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

Обработка, исправляющая ситуацию с отрицательными номерами строк в табличной части

1 стартмани

31.08.2017    13437    1    C0mmander_Alex    1    

3

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

1. Обработка позволяет совершать следующие действия над объектами: а. СПРАВОЧНИКИ: удаление; пометка на удаление; снятие пометки на удаление. б. ДОКУМЕНТЫ: удаление; пометка на удаление; снятие пометки на удаление; проведение; отмена проведения; выключить проводки; включить проводки. 2. Действия могут быть ограничены некоторыми условиями. 3. Существует отбор по видам объектов. 4. Есть возможность обработать подчиненные справочники.

1 стартмани

30.04.2017    22438    81    DUH    0    

5

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

Обработки можно использовать в любой конфигурации 1С-Предприятия 7.7. Обработки позволяют просмотреть/изменить значения любого реквизита документов/справочников, существующих в базе. В обработках реализован множественный отбор по значениям реквизитов (для табличной части документов тоже). В обработке документов реализованы следующие действия: Перенумерация; проведение; отмена проведения; пометка на удаление; непосредственное удаление; снятие пометки удаления; изменение реквизитов; очистка реквизитов; удаление строк табличной части; вывод на печать и в файлы *.xls,*.csv,*.dbf,*.xml реквизитов шапки и табличной части. В обработке справочников реализованы следующие действия: Перенумерация; пометка на удаление; непосредственное удаление; снятие пометки удаления; изменение реквизитов; очистка реквизитов; очистка истории значений периодического реквизита; перенос справочника в другую базу подобной конфигурации по OLE; вывод на печать реквизитов и истории значений периодических реквизитов; вывод реквизитов в файлы *.xls,*.csv,*.dbf,*.xml; отчет по структуре справочников, вывод и обработка ссылок на выбранные элементы.

1 стартмани

23.11.2016    38496    217    SanchoD    15    

13

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

База данных помечается Suspect, когда SQL Server не может читать файлы данных, связанные с базой данных с жесткого диска. В этом случае сделать бекап базы нельзя, но можно попробовать образ диска. После того как возможность читать файлы данных восстановлена, вы можете перезапустить службу SQL Server, и если возможно, произойдет автоматическое восстановление. Что делать, если информационная база 1С7.7 на SQL Server 2000 перешла в состояние suspect? Если это произошло утром и бекап сделан, Вы, конечно, можете грохнуть и раскатать базу заново (вечером это проблематичнее), но не торопитесь - возможно, поможет detach+attach или другие методы, изложенные в данной публикации.

1 стартмани

08.11.2016    23013    ksnik    5    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. axxell 1054 14.01.13 10:18 Сейчас в теме
(1) Ёпрст,
Ага, хорошая обработка, проголосовал. Только я свою создал в 2008 году и дополнительно предлагаю механизм группового проведения по некоторым регистрам документа, а не по всем сразу.
3. Ёпрст 1064 14.01.13 13:05 Сейчас в теме
на счет давности, аналогичные поделки на проклабе валяются еще с 2000 года.
Смысл моей поделки - не трогать конфу и код в ней вообще.
Оставьте свое сообщение