Запись в РС данными из вызываемой формы

1. user1202776 09.07.19 11:00 Сейчас в теме
Если в таблице изменяется количество, вызывается форма, в котором нужно указать причину изменения количества,сколько было до изменения и сколько стало после изменения и еще комментарий. И эти данные должны записываться в регистр сведений РедактированияДокументов. Как это реализовать?
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Запрос=Новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	             |	РеализацияТоваровУслугТовары.Ссылка,
	             |	РеализацияТоваровУслугТовары.Ссылка.Ссылка КАК Ссылка1,
	             |	РеализацияТоваровУслугТовары.Номенклатура,
	             |	РеализацияТоваровУслугТовары.Количество
	             |ИЗ
	             |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
	             |ГДЕ
	             |	РеализацияТоваровУслугТовары.Ссылка = &Ссылка";
	Запрос.УстановитьПараметр("Ссылка",ЭтотОбъект.Ссылка);
	Выборка=Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
	КонецЦикла;
	
		КоличествоИзмененоВручную = ИСТИНА;
	Если КоличествоИзмененоВручную Тогда
		
	Форма=РегистрыСведений.ЛогРедактированияДокументов.ПолучитьФорму("ФормаРеализации");
	Форма.Открыть();
	
		Движение = РегистрыСведений.ЛогРедактированияДокументов.СоздатьМенеджерЗаписи();
	
	Движение.Документ=Выборка.Ссылка;
	Движение.Пользователь=ПараметрыСеанса.ТекущийПользователь;
	Движение.Было=Выборка.Количество;
	Движение.Стало=Выборка.Количество;
	Движение.Резерв=Выборка.Количество;
	Движение.Комментарий=Форма.ПолеВвода1;
	Движение.Период=ТекущаяДата();
	Движение.Резерв=Выборка.Количество;
	Движение.Регистратор=Выборка.Ссылка;
	Движение.Товар=Выборка.Номенклатура;
	Движение.Активность=Истина;
	Движение.Записать();
КонецЕсли;

  КонецПроцедуры // ПередЗаписью()
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
11. DJDUH 17 09.07.19 12:24 Сейчас в теме
(1) Вижу Вы уже несколько дней пытаетесь то записать при закрытии формы, то про100 записать в РС из формы.

Случайно нет версионирования в конфигурации, может будет проще его включить?

Как по мне, то такую задачку необходимо решать например через какой-то признак в строке ТЧ (булево) - типа Пусто (Ложь) если его никто не трогал и как только кто-то что-либо изменил в колонке кол-во сразу стал "Истина", ну и колонку для запоминания старого значения. тип(Число(15,3)) в которое пишеться Кол-во до изменения.

Затем "перед записью" в цикле смотреть, какая строка изменена и только после этого писать в РС. ну можно и сразу отобрать массив строк по этому признаку и записать набор.
12. most_fucking 09.07.19 12:50 Сейчас в теме
(11) Есть признак модифицированность, но если бы можно было как-то посмотреть что модифицировано, было бы все просто
14. user1202776 09.07.19 12:55 Сейчас в теме
(12)то есть если можно было как-то узнать какая строчка изменена?
15. most_fucking 09.07.19 12:56 Сейчас в теме
(14) То есть если можно было бы, а так, насколько я знаю, нельзя
13. most_fucking 09.07.19 12:51 Сейчас в теме
(11) Понимаете в чем дело, что если количество было 8, затем изменили на 10, а потом снова на 8, то это будет как изменение
16. DJDUH 17 09.07.19 13:05 Сейчас в теме
(13) А должно быть, как "нет"!?

Тогда только один раз записывать значение в колонку иначе тогда, как-понять, что это значение первое!?
17. most_fucking 09.07.19 13:10 Сейчас в теме
(16) Так модифицированность - это признак, возможно конечно, что он где-то глубже хранит форму, но я не рыл в ту сторону
18. user1202776 09.07.19 13:12 Сейчас в теме
(17)форма находится в регистре сведений,куда будут записываться данные
2. most_fucking 09.07.19 11:46 Сейчас в теме
Ну во-первых это бред, что пользователь будет вписывать количество старое и новое. Во-вторых я бы сделал так, я бы запоминал всю таблицу до изменения, затем перед проведением сравнивал таблицы и если разницу записывал в третью таблицу, потом выбиваю окошко с комментарием и пишу в регистр данные из 3-ей таблицы
3. user1202776 09.07.19 11:54 Сейчас в теме
(2)хорошо. как сделать так, как вы сказали?
4. most_fucking 09.07.19 11:56 Сейчас в теме
Ну изначально в Процедуре ПриОткрытии() проверяешь новый это документ или нет, если нет то копируешь табличную часть. Дальше ПередЗаписью(), там делаешь сравнение таблиц, дальше уже все понятно
5. most_fucking 09.07.19 11:57 Сейчас в теме
(4) Только таблицу в переменную копируй, что бы можно было в модуле объекта получить эту таблицу
6. user1202776 09.07.19 11:59 Сейчас в теме
(4)сможете привести пример кода, как это сделать?
7. most_fucking 09.07.19 12:01 Сейчас в теме
Не считаю что сделать вашу работу за вас это правильно, форум что бы подсказать, направить, а не тупо код вам отправить, скажите что вам не понятно, я объясню. Вроде бы ничего сложного нет
9. user1202776 09.07.19 12:12 Сейчас в теме
(7)как скопировать таблицу в переменную и как потом их сравнить?
10. most_fucking 09.07.19 12:13 Сейчас в теме
8. most_fucking 09.07.19 12:11 Сейчас в теме
Форма документа:

Перем ТаблицаДоИзменения Экспорт;

Процедура ПриОткрытии()
        Если ЭтоНовый() Тогда
        //
        Иначе
        ТаблицаДоИзменения = ТабЧасть.Выгрузить();
        КонецЕсли;

КонецЕсли;
Показать

Модуль Объекта:

Перем ТаблицаИзменений;
Процедура передЗаписью()

          ТаблицаИзменений = Новый ТаблицаЗначений;

          КопияТаблицы = табЧасть.Скопировать();
          КопиТаблицы.Свернуть("номенклатура", "Количество");
          Для Каждого Строка Из КопияТаблицы Цикл
                  //сравнить 2 поля
                 //загрузить в таблицу изменений 
          КонецЦикла;

КонецПроцедуры

Процедура ОбработкаПроведения()


Если ТаблицаИзменений.Количество() = 0 Тогда
         //
Иначе
         //движения по регистру сведений
КонецЕсли;

КонецПроцедуры
Показать
20. user1202776 09.07.19 13:35 Сейчас в теме
(8) не получается сравнить
21. most_fucking 09.07.19 13:36 Сейчас в теме
(20) Как делаете? Пример кода киньте
22. user1202776 09.07.19 13:42 Сейчас в теме
(21)совсем не то делаю.В интернете какой-то способ нашел с функцией, и пробовал этот способ использовать.Как сравнить таблицы?)
24. most_fucking 09.07.19 13:46 Сейчас в теме
(22)
Для Каждого Строка Из табЧасть Цикл

        НайденныеСтроки = ТаблицаДоИзменений.НайтиСтроки("Номенклатура", Строка.Номенклатура);
        Если НайденныеСтроки <> 0 Тогда
                 Если НайденнаяСтроки.Количество <> Строка.Количество Тогда
                           НоваяСтрока = ТаблицаИзменений.Добавить();
                           НоваяСтрока.Номенклатура = Строка.Номенклатура;
                           //поля которые нужны
                 конецЕсли;
          КонецЕсли;
КонецЦикла;
Показать
23. user1202776 09.07.19 13:45 Сейчас в теме
(21)
КопияТаблицы = Товары.Скопировать();
          КопияТаблицы.Свернуть("Номенклатура", "Количество");
          Для Каждого Строка Из КопияТаблицы Цикл
                СравнитьТаблицыНаборовЗаписей(ТаблицаДоИзменения , ТаблицаИзменений, ИменаПолейЧерезЗапятую); 
    ТаблицаДоИзменения.Сортировать().ЗначениеВСтрокуВнутр() = ТаблицаИзменений.Сортировать(ИменаПолейЧерезЗапятую).ЗначениеВСтрокуВнутр()
                 //загрузить в таблицу изменений 
          КонецЦикла;
25. most_fucking 09.07.19 13:48 Сейчас в теме
(23) код процедуры мне самому придумать?

СравнитьТаблицыНаборовЗаписей()
26. most_fucking 09.07.19 13:49 Сейчас в теме
(23)
СравнитьТаблицыНаборовЗаписей


Где бы вы не взяли код, вам придется включить голову и немного подумать, вы не найдете код, который будет у вас работать сразу после копирования
27. most_fucking 09.07.19 13:57 Сейчас в теме
(23) И посмотрите что вы делаете вообще. запускаете цикл, и сравниваете совершенно другие таблицы, зачем вам цикл, если его перебор вам не нужен. Вам нужно сравнить ТаблицуДоИзменений и ТабЧасть, по идеи где-то так должно быть

ТаблицаСравнения = СравнитьТаблицыНаборовЗаписей(ТаблицаДоИзменения , ТабЧасть.Выгрузить(), ИменаПолейЧерезЗапятую); 
    ТаблицаСравнения .Сортировать("Номенклатура Возр")


Я просто не знаю что делает ваша функция
29. user1202776 09.07.19 14:44 Сейчас в теме
(27)Переменная не определена (табЧасть)
30. most_fucking 09.07.19 14:47 Сейчас в теме
(29) Это табличная часть документа, как она у вас называется, так и пишете
31. user1202776 09.07.19 14:49 Сейчас в теме
(30)ну я поменял на "Товары".Таблица так называется
32. most_fucking 09.07.19 14:51 Сейчас в теме
19. starjevschik 09.07.19 13:14 Сейчас в теме
ПередЗаписью документ еще не записан после модификации, но он записан в базу, он же не новый? Получить старый вариант можно через Ссылка.
Т.е. в Ссылка.Товары будет старый вариант, до текущего редактирования.
В Товары - текущий вариант после редактирования.
Поскольку 1С по каким-то до сих пор загадочным причинам ссылки на строки ТЧ не хранит, то остается проблема найти строку из нового в старом. Если в ТЧ не повторяются товары, или например товар+серия, то это несложно. Если могут повторяться, то проще свернуть по товарам и смотреть общее изменение. И его записывать куда-то.
Искать различия можно простым перебором, только их нужно два: сначала перебрать новый вариант и найти аналоги в старом, потом наоборот, т.к. иначе можно потерять полностью удаленные или вновь добавленные строки.
most_fucking; +1 Ответить
28. DJDUH 17 09.07.19 14:32 Сейчас в теме
(19) точняк, я об этом и не подумал.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот