Имя: Пароль:
1C
 
Ручная корректировка записей регистра сведений, созданных документом.
0 SuperMario
 
10.03.09
12:27
Суть задачи- дать возможность вручную корректировать записи регистра сведений, которые изначально записал документ при проведении.
Регистр сведений независимый и непериодический.
В данный момент при проведении документа создаются записи регистра. Ест-но при перепроведении все убивается.
Стирать их нужно, но только если удалили строку в мн. части документа для этой записи.

Какие идеи могут возникнуть в ваших светлых головах?
1 Mitriy
 
10.03.09
12:29
залезть в обработку ОбработкаУдаленияПроведения...
2 Mitriy
 
10.03.09
12:31
(1)+ или в ПередЗаписью, или ПриЗаписи... Где записи создаются, в общем...
3 SuperMario
 
10.03.09
12:31
(1) а если удалять ничего не нужно, а только изменить содержимое записи?
4 GenV
 
10.03.09
12:32
(3) Можно не удалять.
5 Михаил Козлов
 
10.03.09
12:33
(0) Я бы сделал сторно неверной записи и новую правильную запись документом КорректировкаЗаписейРегистровНакопления.
6 SuperMario
 
10.03.09
12:35
(5) не пойдет. Потом разбираться мастеру со всеми этими записями долго.
7 SuperMario
 
10.03.09
12:36
Собственно вот процедура проведения:

   ЗапросДвижениеПорегисору = Новый Запрос;
   ЗапросДвижениеПорегисору.Текст = "ВЫБРАТЬ
                                    |    ККМ.Модель,
                                    |    ККМ.Договор,
                                    |    ККМ.Модификация,
                                    |    ККМ.Документ,
                                    |    ККМ.НомерККМ
                                    |ИЗ
                                    |    РегистрСведений.ККМ КАК ККМ
                                    |ГДЕ
                                    |    ККМ.Документ = &ДокументСсылка
                                    |    И ККМ.Договор = &Договор";
   
   ЗапросДвижениеПорегисору.УстановитьПараметр( "ДокументСсылка",ДокументСсылка);
   ЗапросДвижениеПорегисору.УстановитьПараметр( "Договор", ДокументСсылка.ДоговорКонтрагента);
   РезультатЗапроса = ЗапросДвижениеПорегисору.Выполнить();
   РегККМ = РегистрыСведений.ККМ.СоздатьНаборЗаписей();
   РегККМ.Отбор.Документ.Установить ( ДокументСсылка );
   Если РезультатЗапроса.Пустой() Тогда  // нет движений по регистру. Создаем их...
       Для Каждого СтрокаТаблицы из Таб Цикл
           ТипНоменклатуры = СтрокаТаблицы.Номенклатура.ВидНоменклатуры.ТипНоменклатуры;
           Если ТипНоменклатуры  = Перечисления.ТипыНоменклатуры.ККМ Тогда
               ЗаписьРегистра = РегККМ.Добавить();
               ЗаписьРегистра.Документ = ДокументСсылка;
               ЗаписьРегистра.Модель  = СтрокаТаблицы.Номенклатура;
               ЗаписьРегистра.ДатаВводаВЭксплуатацию = ДокументСсылка.дата;
               ЗаписьРегистра.Договор =  ДокументСсылка.ДоговорКонтрагента;
               ЗаписьРегистра.Модификация = СтрокаТаблицы.Модификация;
               ЗаписьРегистра.НомерККМ  = СтрокаТаблицы.НомерККМ;
               ЗаписьРегистра.НомерСтрокиТЧ = СтрокаТаблицы.НомерСтроки;
           КонецЕсли;
       КонецЦикла;
       РегККМ.Записать();
   Иначе  // запишем только измененные записи
       СтруктураОтбора = Новый  Структура ("Документ", ДокументСсылка);
       ЗаписьРегистраККМ  = РегистрыСведений.ККМ.Выбрать( СтруктураОтбора );
       Для Каждого  СтрокаТаблицы из Таб Цикл
           ЗаписьРегистраККМ.Следующий();
           Если   ( СтрокаТаблицы.Номенклатура =   ЗаписьРегистраККМ.Модель ) и ( СтрокаТаблицы.Модификация = ЗаписьРегистраККМ.Модификация )
               и ( СтрокаТаблицы.НомерККМ =  ЗаписьРегистраККМ.НомерККМ ) и ( СтрокаТаблицы.НомерСтроки  = ЗаписьРегистраККМ .НомерСтрокиТЧ ) Тогда
               Продолжить;
           Иначе
               МенеджерЗаписиККМ = ЗаписьРегистраККМ.ПолучитьМенеджерЗаписи();
               МенеджерЗаписиККМ.Модель  = СтрокаТаблицы.Номенклатура;
               МенеджерЗаписиККМ.ДатаВводаВЭксплуатацию = ДокументСсылка.дата;
               МенеджерЗаписиККМ.Договор =  ДокументСсылка.ДоговорКонтрагента;
               МенеджерЗаписиККМ.Модификация = СтрокаТаблицы.Модификация;
               МенеджерЗаписиККМ.НомерККМ  = СтрокаТаблицы.НомерККМ;
               МенеджерЗаписиККМ.Записать();
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;
8 Mitriy
 
10.03.09
12:37
(3) если регистр независимый, значит все делается вручную, в коде прописано, что удалять, чего не удалять... свои правила прописать надо, и все...
9 SuperMario
 
10.03.09
12:39
(8) не получается изменить запись пока. См. (7)
Вот условие

Если   ( СтрокаТаблицы.Номенклатура =   ЗаписьРегистраККМ.Модель ) и ( СтрокаТаблицы.Модификация = ЗаписьРегистраККМ.Модификация )
               и ( СтрокаТаблицы.НомерККМ =  ЗаписьРегистраККМ.НомерККМ ) и ( СтрокаТаблицы.НомерСтроки  = ЗаписьРегистраККМ .НомерСтрокиТЧ ) Тогда

Т.е. есил запись была изменена, то получаю ее менеджера и меняю.
Но ест ькосяк. он добавляет запись, а не изменяет ее :(
10 Aprobator
 
10.03.09
12:55
(7) РегККМ.Отбор.Документ.Установить ( ДокументСсылка );
   РегККМ.Прочитать(); // получили записи регистра сделаные данным доком
   ТЗЗаписей = РегККМ.Выгрузить(); // получили таблицу записей по ней удобнее делать поиск
   Если ЗаписьНайдена, то кооректируем нужную строку
   Иначе
   НоваяСтрока = ТЗЗаписей.Добавить();
   РегККМ.Загрузить(ТЗЗаписей);
   РегККМ.Записать();
11 Aprobator
 
10.03.09
13:06
(7) сдается мне что в        ЗаписьРегистраККМ  = РегистрыСведений.ККМ.Выбрать( СтруктураОтбора ); легкий бардачок в структуре отбора.
Вот это требование выполняется (выдержка из СП):
В качестве полей для отбора могут задаваться измерения или реквизиты, для которых в конфигураторе признак индексирования установлен в значение "Индексировать" или установлен признак "Ведущее".
Важно! Структура может содержать только один элемент.
12 Михаил Козлов
 
10.03.09
13:08
Виноват: просмотрел, что это независимый РС.
13 SuperMario
 
10.03.09
13:10
(11) если для измерения Документ не поставить "Индексировать" , то он вообще отбор не делает. Пишет ошибку в параметре "1" метода Выбрать()
14 Aprobator
 
10.03.09
13:16
(13) тады странно. Вообще надо смотреть отладчиком, что у тебя попадает в МенеджерЗаписиККМ. И еще, а где проверка что ЗаписьРегистраККМ.Следующий() = Истина? Вообще см. 10. В данном случае это удобнее (на мой взгляд).
15 SuperMario
 
10.03.09
14:29
(14) ,да тут ошибка. Если строку добавить новую, то вылетит. Сейчас исправлю.
16 SuperMario
 
10.03.09
14:52
Морока, если порядок строк поменяли в таличной части дока. Вот думаю, может какой другой способ есть? Что то навеяло на меня из 7.7 ТиС. Как у них справочник партий зделан с регом портии наличие и отданные. Уродство, кончно. Но очень хочется разделить движение документа и корректировку ручную.
17 GenV
 
10.03.09
14:58
(16) Для этого и перепроводят документы, а не корректируют вручную.
ЗЫ Здается мне у тебя неправильный механизм проведения или хранения данных в ТЧ изначально.
18 SuperMario
 
10.03.09
15:04
(17) тут ты прав. Но заказчик, как всегда, тоже прав. Поэтому нужно делать финт ушами.
Заносить данные по дате изготовления товара, марке пломбы, прошивке, типу насоса, процессору и прочей ерунды в документе  мастер по ремонту не хочет (да и не должен). В тоже время создать первоначальную запись по привязке товара к контрагенту заказчик хочет именно в момент проведения.
19 GenV
 
10.03.09
15:09
(18) Привязку как определяете, куда/кто заносит? Не проще не давать человеку заносящему привязку не менять уже занесенные данные, а только привязку. Или сохранять списанные ТМЦ (полученные из движений перед их очисткой) и проверять при списании на соответствие.
20 SuperMario
 
10.03.09
15:17
Привязка идет: товар+ номер + модификация. Эти данные заносятся документом.
Все остальное мастер руками.

Что было понятно.
Регистр ККМ.
Измерения: Товар, модификация, серийный номер.
Ресурсы: тип процессора, адрес установки, прошивка, тип насоса, модель насоса и т.д.

Мастер редактиирует эти данные на форме элемента контрагента (для его интерфейса создал специально). Там висит элемент формы табличное поле, связянное с РегистрСведенийСписок.
21 SuperMario
 
10.03.09
15:18
(20)+ соответственно данные по модели , модификации и номеру он уже видит.
22 GenV
 
10.03.09
15:23
(20) Т.е. документом делуются движения по ККМ без учета ресурсов и серии. Потом мастер детализирует эти данные и меняет проведение соотв. документа?
ЗЫ Как вариант: в документе сделать ТЧ с подробными данными, краткое заполнение первоночально, подробное мастером: обработкой по ТЗ с данными из док-ов и перезаписью их ТЧ-ей и проведением измененных документов.
23 SuperMario
 
10.03.09
15:45
(22) да
ЗаписьРегистра.Документ = ДокументСсылка;
ЗаписьРегистра.Модель  = СтрокаТаблицы.Номенклатура;// измерение
ЗаписьРегистра.ДатаВводаВЭксплуатацию = ДокументСсылка.дата; // измерение
ЗаписьРегистра.Договор =  ДокументСсылка.ДоговорКонтрагента; // измерение
ЗаписьРегистра.Модификация = СтрокаТаблицы.Модификация; // измерение
ЗаписьРегистра.НомерККМ  = СтрокаТаблицы.НомерККМ; // измерение

"подробное мастером: обработкой по ТЗ с данными из док-ов и перезаписью их ТЧ-ей и проведением измененных документов."
А кто-нить дату запрета поставит и приехали :-(
24 GenV
 
10.03.09
15:54
(23)
1) Дата запрета главным образом на изменение движений должна ставится ...
2) Какая разница чем менять движения документов в закрытом периоде? А если их захотят перепровести и данные детализации сбросятся? Проще правильно настроить права у пользователей и запретить интерактивное редактирования документов, если уже введена детализация в документ.
ЗЫ Это самый правильный и безопасный вариант. ИМХО.
25 SuperMario
 
10.03.09
20:20
И все- таки решил написать свою процедуру проведения с сохранением записей регистра.
26 SuperMario
 
16.03.09
09:12
Отказался от (25)
Решение таково:
Регистр ККМ зделал подчиненным регистратору. Создал документ "ЗаписьРегистраККМ". Создал форму документа идентичную форме записи регистра, когда он не был подчинен. Теперь у записи рега ККМ есть ссылка! В табличной части документа, который должен делать первоначальное заполнение, создал реквизит - ссылку на документ : "ЗаписьРегистраККМ". При записи документ заполняет необходимые поля. Далее мастер попадает в журнал этих документов и вызывает форму документа, а не записи рега и дозаполняет все остальные поля.
Внешне формы практически совпадают.
В итоге схема такая: РеализацияТоваровИУслуг --> ЗаписьРегистраККМ --> строка записи регистра ККМ.
27 i-rek
 
16.03.09
09:14
А чё б не сделать как в типовых ? С галочкой "ручная корректировка" ?
28 SuperMario
 
16.03.09
09:17
(27) это где ты такую красоту видел?
29 Snovy
 
16.03.09
09:23
(27) Ручная корректировка - разовая вещь. Не понравились движения документа, взводим флажок и руками правим данные прямо в соответствующих регистрах. После этого проведение документа запрещено. Идея хорошая, но реализация - развод для лохов, простите за грубость...
30 SuperMario
 
16.03.09
09:27
(28), (29) Хлопцы, а где в УТ есть возможность ручной кореектировки записей регистров?
31 Snovy
 
16.03.09
09:28
(30) Только в БП...
32 SuperMario
 
16.03.09
09:31
Понял. Ну примерно представляю о чем идет речь. Даже если разрешить проведение документа после ручной корректировки,  то ручная работа потрется вся.
33 Snovy
 
16.03.09
09:35
(32) Ага. Учитывая, что в БП только на принятии к учету ОС, НДС и на выпусках ГП вываливаются регистры накопления, а во всем оситальном только проводки по плану счетов, то в БП еще имеет право на жизнь "такая" ручная корректировка. Я представляю, если это разрешить в УПП, да и в той же УТ... вся система взорвется через неделю.
34 SuperMario
 
16.03.09
09:48
Народ, как считаете, рекомендовать (26) в КЗ?