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

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) точняк, я об этом и не подумал.
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день