Имя: Пароль:
1C
1С v8
Следим за ИзмененияОбъектов
0 Прохожий
 
02.10.12
10:24
Есть такой регистр сведений - ИзмененияОбъектов. И он, по моему, хуже чес 1Sjornal в семерке.
Извиняюсь за код, но это надо видеть:
...
Процедура РегистрацияИзмененийСделанныхВДокументеПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
   
   ТекущийПользователь = ОпределитьТекущегоПользователя();

   Если РольДоступна("ПросмотрОтчетов") Тогда
       Возврат;
   КонецЕсли;
   Если Отказ Тогда
       Возврат;
   КонецЕсли;
   
   НаборЗаписей = РегистрыСведений.ИзмененияОбъектов.СоздатьНаборЗаписей();
   Если Документы[Источник.Метаданные().Имя].ПустаяСсылка() = Источник.Ссылка Тогда
       НовСсылка = Документы[Источник.Метаданные().Имя].ПолучитьСсылку();
       Источник.УстановитьСсылкуНового(НовСсылка);
       НоваяЗапись = НаборЗаписей.Добавить();
       НоваяЗапись.СсылкаНаОбъект = НовСсылка;
       НоваяЗапись.Период = ТекущаяДата();
       НоваяЗапись.Ответственный = ТекущийПользователь;
       НоваяЗапись.Компьютер = ИмяКомпьютера();
       НоваяЗапись.СостояниеОбъекта = "Добавление";
   ИначеЕсли Источник.ПометкаУдаления <> Источник.Ссылка.ПометкаУдаления Тогда
       Если Источник.ПометкаУдаления Тогда
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.СостояниеОбъекта = "Пометка на удаление";
       Иначе
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.СостояниеОбъекта = "Снятие пометки на удаление";
       КонецЕсли;
   Иначе
       Если Источник.Номер <> Источник.Ссылка.Номер Тогда
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.Реквизит = "Номер";
           НоваяЗапись.БывшЗначение = Источник.Ссылка.Номер;
           НоваяЗапись.СтавшЗначение = Источник.Номер;
           НоваяЗапись.СостояниеОбъекта = РежимЗаписи;
       КонецЕсли;
       Если Источник.Дата <> Источник.Ссылка.Дата Тогда
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.Реквизит = "Дата";
           НоваяЗапись.БывшЗначение = Источник.Ссылка.Дата;
           НоваяЗапись.СтавшЗначение = Источник.Дата;
           НоваяЗапись.СостояниеОбъекта = РежимЗаписи;
       КонецЕсли;
       Для каждого Реквизит Из Источник.Метаданные().Реквизиты Цикл
           Если Источник[Реквизит.Имя] <> Источник.Ссылка[Реквизит.Имя] Тогда
               НоваяЗапись = НаборЗаписей.Добавить();
               НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
               НоваяЗапись.Период = ТекущаяДата();
               НоваяЗапись.Компьютер = ИмяКомпьютера();
               НоваяЗапись.Ответственный = ТекущийПользователь;
               НоваяЗапись.Реквизит = Реквизит.Имя;
               НоваяЗапись.БывшЗначение = Источник.Ссылка[Реквизит.Имя];
               НоваяЗапись.СтавшЗначение = Источник[Реквизит.Имя];
               НоваяЗапись.СостояниеОбъекта = РежимЗаписи;
           КонецЕсли;
       КонецЦикла;
       Если НоваяЗапись = Неопределено И РежимЗаписи <> РежимЗаписиДокумента.Запись Тогда
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.СостояниеОбъекта = РежимЗаписи;
       КонецЕсли;
       Для каждого Таблица Из Источник.Метаданные().ТабличныеЧасти Цикл
           Индекс = 0;
           Пока Истина Цикл
               Если Источник[Таблица.Имя].Количество() >= Индекс + 1 Или Источник.Ссылка[Таблица.Имя].Количество() >= Индекс + 1 Тогда
                   Для каждого Реквизит Из Таблица.Реквизиты Цикл
                       Если Источник.Ссылка[Таблица.Имя].Количество() >= Индекс + 1 И Источник[Таблица.Имя].Количество() >= Индекс + 1 Тогда
                           Если Источник[Таблица.Имя][Индекс][Реквизит.Имя] <> Источник.Ссылка[Таблица.Имя][Индекс][Реквизит.Имя] Тогда
                               НоваяЗапись = НаборЗаписей.Добавить();
                               НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
                               НоваяЗапись.Период = ТекущаяДата();
                               НоваяЗапись.Компьютер = ИмяКомпьютера();
                               НоваяЗапись.Ответственный = ТекущийПользователь;
                               НоваяЗапись.Таблица = Таблица.Имя;
                               НоваяЗапись.НомераСтрок = "Строка " + (Индекс + 1);
                               НоваяЗапись.Реквизит = Реквизит.Имя;
                               НоваяЗапись.БывшЗначение = Источник.Ссылка[Таблица.Имя][Индекс][Реквизит.Имя];
                               НоваяЗапись.СтавшЗначение = Источник[Таблица.Имя][Индекс][Реквизит.Имя];
                               НоваяЗапись.СостояниеОбъекта = "Изменение строки";
                           КонецЕсли;
                       ИначеЕсли Источник.Ссылка[Таблица.Имя].Количество() >= Индекс + 1 Тогда
                           Если ЗначениеЗаполнено(Источник.Ссылка[Таблица.Имя][Индекс][Реквизит.Имя]) Тогда
                               НоваяЗапись = НаборЗаписей.Добавить();
                               НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
                               НоваяЗапись.Период = ТекущаяДата();
                               НоваяЗапись.Компьютер = ИмяКомпьютера();
                               НоваяЗапись.Ответственный = ТекущийПользователь;
                               НоваяЗапись.Таблица = Таблица.Имя;
                               НоваяЗапись.НомераСтрок = "Строка " + (Индекс + 1);
                               НоваяЗапись.Реквизит = Реквизит.Имя;
                               НоваяЗапись.БывшЗначение = Источник.Ссылка[Таблица.Имя][Индекс][Реквизит.Имя];
                               НоваяЗапись.СостояниеОбъекта = "Удаление строки";
                           КонецЕсли;
                       Иначе
                           Если ЗначениеЗаполнено(Источник[Таблица.Имя][Индекс][Реквизит.Имя]) Тогда
                               НоваяЗапись = НаборЗаписей.Добавить();
                               НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
                               НоваяЗапись.Период = ТекущаяДата();
                               НоваяЗапись.Компьютер = ИмяКомпьютера();
                               НоваяЗапись.Ответственный = ТекущийПользователь;
                               НоваяЗапись.Таблица = Таблица.Имя;
                               НоваяЗапись.НомераСтрок = "Строка " + (Индекс + 1);
                               НоваяЗапись.Реквизит = Реквизит.Имя;
                               НоваяЗапись.СтавшЗначение = Источник[Таблица.Имя][Индекс][Реквизит.Имя];
                               НоваяЗапись.СостояниеОбъекта = "Добавление строки";
                           КонецЕсли;
                       КонецЕсли;
                   КонецЦикла;
               Иначе
                   Прервать;
               КонецЕсли;
               Индекс = Индекс + 1;
           КонецЦикла;
       КонецЦикла;
   КонецЕсли;
   НаборЗаписей.Записать(Ложь);
КонецПроцедуры

Процедура РегистрацияИзмененийСделанныхВСправочникеПередЗаписью(Источник, Отказ) Экспорт
   
   ТекущийПользователь = ОпределитьТекущегоПользователя();

   Если РольДоступна("ПросмотрОтчетов") Тогда
       Возврат;
   КонецЕсли;
   Если Отказ Тогда
       Возврат;
   КонецЕсли;
   
   НаборЗаписей = РегистрыСведений.ИзмененияОбъектов.СоздатьНаборЗаписей();
   Если Справочники[Источник.Метаданные().Имя].ПустаяСсылка() = Источник.Ссылка Тогда
       НовСсылка = Справочники[Источник.Метаданные().Имя].ПолучитьСсылку();
       Источник.УстановитьСсылкуНового(НовСсылка);
       НоваяЗапись = НаборЗаписей.Добавить();
       НоваяЗапись.СсылкаНаОбъект = НовСсылка;
       НоваяЗапись.Период = ТекущаяДата();
       НоваяЗапись.Ответственный = ТекущийПользователь;
       НоваяЗапись.Компьютер = ИмяКомпьютера();
       НоваяЗапись.СостояниеОбъекта = "Добавление";
   ИначеЕсли Источник.ПометкаУдаления <> Источник.Ссылка.ПометкаУдаления Тогда
       Если Источник.ПометкаУдаления Тогда
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.СостояниеОбъекта = "Пометка на удаление";
       Иначе
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.СостояниеОбъекта = "Снятие пометки на удаление";
       КонецЕсли;
   Иначе
       Если Источник.Код <> Источник.Ссылка.Код Тогда
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.Реквизит = "Код";
           НоваяЗапись.БывшЗначение = Источник.Ссылка.Код;
           НоваяЗапись.СтавшЗначение = Источник.Код;
           НоваяЗапись.СостояниеОбъекта = "Изменение";
       КонецЕсли;
       Если Источник.Наименование <> Источник.Ссылка.Наименование Тогда
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
           НоваяЗапись.Период = ТекущаяДата();
           НоваяЗапись.Компьютер = ИмяКомпьютера();
           НоваяЗапись.Ответственный = ТекущийПользователь;
           НоваяЗапись.Реквизит = "Наименование";
           НоваяЗапись.БывшЗначение = Источник.Ссылка.Наименование;
           НоваяЗапись.СтавшЗначение = Источник.Наименование;
           НоваяЗапись.СостояниеОбъекта = "Изменение";
       КонецЕсли;
       Для каждого Реквизит Из Источник.Метаданные().Реквизиты Цикл
           Если Источник[Реквизит.Имя] <> Источник.Ссылка[Реквизит.Имя] Тогда
               НоваяЗапись = НаборЗаписей.Добавить();
               НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
               НоваяЗапись.Период = ТекущаяДата();
               НоваяЗапись.Компьютер = ИмяКомпьютера();
               НоваяЗапись.Ответственный = ТекущийПользователь;
               НоваяЗапись.Реквизит = Реквизит.Имя;
               НоваяЗапись.БывшЗначение = Источник.Ссылка[Реквизит.Имя];
               НоваяЗапись.СтавшЗначение = Источник[Реквизит.Имя];
               НоваяЗапись.СостояниеОбъекта = "Изменение";
           КонецЕсли;
       КонецЦикла;
       Для каждого Таблица Из Источник.Метаданные().ТабличныеЧасти Цикл
           Индекс = 0;
           Пока Истина Цикл
               Если Источник[Таблица.Имя].Количество() >= Индекс + 1 Или Источник.Ссылка[Таблица.Имя].Количество() >= Индекс + 1 Тогда
                   Для каждого Реквизит Из Таблица.Реквизиты Цикл
                       Если Источник.Ссылка[Таблица.Имя].Количество() >= Индекс + 1 И Источник[Таблица.Имя].Количество() >= Индекс + 1 Тогда
                           Если Источник[Таблица.Имя][Индекс][Реквизит.Имя] <> Источник.Ссылка[Таблица.Имя][Индекс][Реквизит.Имя] Тогда
                               НоваяЗапись = НаборЗаписей.Добавить();
                               НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
                               НоваяЗапись.Период = ТекущаяДата();
                               НоваяЗапись.Компьютер = ИмяКомпьютера();
                               НоваяЗапись.Ответственный = ТекущийПользователь;
                               НоваяЗапись.Таблица = Таблица.Имя;
                               НоваяЗапись.НомераСтрок = "Строка " + (Индекс + 1);
                               НоваяЗапись.Реквизит = Реквизит.Имя;
                               НоваяЗапись.БывшЗначение = Источник.Ссылка[Таблица.Имя][Индекс][Реквизит.Имя];
                               НоваяЗапись.СтавшЗначение = Источник[Таблица.Имя][Индекс][Реквизит.Имя];
                               НоваяЗапись.СостояниеОбъекта = "Изменение строки";
                           КонецЕсли;
                       ИначеЕсли Источник.Ссылка[Таблица.Имя].Количество() >= Индекс + 1 Тогда
                           Если ЗначениеЗаполнено(Источник.Ссылка[Таблица.Имя][Индекс][Реквизит.Имя]) Тогда
                               НоваяЗапись = НаборЗаписей.Добавить();
                               НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
                               НоваяЗапись.Период = ТекущаяДата();
                               НоваяЗапись.Компьютер = ИмяКомпьютера();
                               НоваяЗапись.Ответственный = ТекущийПользователь;
                               НоваяЗапись.Таблица = Таблица.Имя;
                               НоваяЗапись.НомераСтрок = "Строка " + (Индекс + 1);
                               НоваяЗапись.Реквизит = Реквизит.Имя;
                               НоваяЗапись.БывшЗначение = Источник.Ссылка[Таблица.Имя][Индекс][Реквизит.Имя];
                               НоваяЗапись.СостояниеОбъекта = "Удаление строки";
                           КонецЕсли;
                       Иначе
                           Если ЗначениеЗаполнено(Источник[Таблица.Имя][Индекс][Реквизит.Имя]) Тогда
                               НоваяЗапись = НаборЗаписей.Добавить();
                               НоваяЗапись.СсылкаНаОбъект = Источник.Ссылка;
                               НоваяЗапись.Период = ТекущаяДата();
                               НоваяЗапись.Компьютер = ИмяКомпьютера();
                               НоваяЗапись.Ответственный = ТекущийПользователь;
                               НоваяЗапись.Таблица = Таблица.Имя;
                               НоваяЗапись.НомераСтрок = "Строка " + (Индекс + 1);
                               НоваяЗапись.Реквизит = Реквизит.Имя;
                               НоваяЗапись.СтавшЗначение = Источник[Таблица.Имя][Индекс][Реквизит.Имя];
                               НоваяЗапись.СостояниеОбъекта = "Добавление строки";
                           КонецЕсли;
                       КонецЕсли;
                   КонецЦикла;
               Иначе
                   Прервать;
               КонецЕсли;
               Индекс = Индекс + 1;
           КонецЦикла;
       КонецЦикла;
   КонецЕсли;
   НаборЗаписей.Записать(Ложь);
КонецПроцедуры
1 Прохожий
 
02.10.12
10:25
И имеем
..
Тилепбергенова Мария Усеновна (12:03:20)
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{ОбщийМодуль.РегистрацияИзмененийВОбъектах.Модуль(136)}: Ошибка при вызове метода контекста (Записать)

по причине:

по причине:
Конфликт блокировок при выполнении транзакции:
Microsoft OLE DB Provider for SQL Server: Lock request time out period exceeded.
HRESULT=80040E31, SQLSrvr: SQLSTATE=HYT00, state=30, Severity=10, native=1222, line=1
2 DrShad
 
02.10.12
10:26
гонишь ты все - нет такого РС
3 Прохожий
 
02.10.12
10:26
пока только заметил, мыслей своих нет.
У РС период регистрации  -секунда, режим записи - независимый. Виснет намертво ибо около 50 человек...
4 Defender aka LINN
 
02.10.12
10:27
И?
5 pavelul73
 
02.10.12
10:28
а отбор для записи в регистр?
6 Прохожий
 
02.10.12
10:28
(2) Такую добрую доработку кто-то сделал.
7 Прохожий
 
02.10.12
10:29
(5) Набору записей отбор установить? Быстрее будет писать?
8 Прохожий
 
02.10.12
10:30
Причем СсылкаНаОбъект даже не Ведущее...
9 Прохожий
 
02.10.12
10:35
(4) Как запись ускорить - это вопрос. Но это конкретно узкое место и оно, по моему, всё равно будет виснуть. Всё на одном регистре завязано. И документы все, и справочники все.
10 DrShad
 
02.10.12
10:35
убей его на юх и юзай версионирование
11 Прохожий
 
02.10.12
10:41
сейчас буду думать...
12 pavelul73
 
02.10.12
10:42
(7) а разве в твоем случае, сейчас этот регистр не полностью перезаписывается без отбора?
13 Прохожий
 
02.10.12
10:43
Сейчас посмотрим
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс