helpf.pro
Регистрация

v8: Перезаписать дату документа

Ermak
01.04.2013 12:52Прочитано: 2938
Есть созданные документы у которых нужно изменить дату, вот что я делаю

Код 1C v 8.х
 Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос = Новый Запрос (
"ВЫБРАТЬ
| ПлатежноеПоручение.Дата КАК Дата,
| ПлатежноеПоручение.Контрагент КАК Контрагент,
| ПлатежноеПоручение.Сумма КАК Сумма,
| ПлатежноеПоручение.НазначениеПлатежа КАК НазначениеПлатежа

|ИЗ
| Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
|ГДЕ
| ПлатежноеПоручение.Дата МЕЖДУ &Дата1 И &Дата2");
Запрос.УстановитьПараметр("Дата1",Дата1);
Запрос.УстановитьПараметр("Дата2",Дата2);
Запрос.УстановитьПараметр("Организация",Организация);
Результат = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.Значение = Результат;
ТЗ = Результат;
ТЗ.Колонки.Добавить("ФлагВыгрузки");

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


Я выбираю нужный период и выгружаю документы в Табличное поле, выбираю "ФлагВыгрузки" и ставлю дату Дата3 какие мне нужно документы изменять. Потом нужно нажать на кнопку Изменить, вот тут и прошу показать мне пример как изменить.
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
01.04.2013 12:58Ответ № 1
(0) Ermak, как-то так:
Код 1C v 8.х
 Для каждого стр из ТЗ цикл
Если стр.ФлагВыгрузки Тогда
ДокОбъект = стр.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
Конецесли;
КонецЦикла;
Ermak
01.04.2013 13:11Ответ № 2
(1) E_Migachev, спасибо будем пробовать
Ermak
01.04.2013 14:53Ответ № 3
что то я не могу понять СсылкаНаДокумент, так что ли

Код 1C v 8.х
 ДокОбъект = Стр.Документы.ПлатежноеПоручение.ПолучитьОбъект();    


но это бред, а как тогда?
sashuly
01.04.2013 15:35Ответ № 4
так запрос будет точнее
Код 1C v 8.х
 
Запрос = Новый Запрос (
"ВЫБРАТЬ
| ПлатежноеПоручение.Ссылка КАК СсылкаНаДокумент,
| ПлатежноеПоручение.Дата КАК Дата,
| ПлатежноеПоручение.Контрагент КАК Контрагент,
| ПлатежноеПоручение.Сумма КАК Сумма,
| ПлатежноеПоручение.НазначениеПлатежа КАК НазначениеПлатежа

|ИЗ
| Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
|ГДЕ
| ПлатежноеПоручение.Дата МЕЖДУ &Дата1 И &Дата2");
E_Migachev
01.04.2013 15:57Ответ № 5
(3) Ermak, как написал (4) sashuly, добавь в запрос:
| ПлатежноеПоручение.Ссылка КАК СсылкаНаДокумент,
Ermak
01.04.2013 16:00Ответ № 6
Че та я запутался

У меня две кнопки, одна "Загрузить данные"

Код 1C v 8.х
 	Запрос = Новый Запрос (
"ВЫБРАТЬ
| ПлатежноеПоручение.Дата КАК Дата,
| ПлатежноеПоручение.Контрагент КАК Контрагент,
| ПлатежноеПоручение.Сумма КАК Сумма,
| ПлатежноеПоручение.НазначениеПлатежа КАК НазначениеПлатежа

|ИЗ
| Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
|ГДЕ
| ПлатежноеПоручение.Дата МЕЖДУ &Дата1 И &Дата2");
Запрос.УстановитьПараметр("Дата1",Дата1);
Запрос.УстановитьПараметр("Дата2",Дата2);
Запрос.УстановитьПараметр("Организация",Организация);
Результат = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.Значение = Результат;
ТЗ = Результат;
ТЗ.Колонки.Добавить("ФлагВыгрузки");


Вторая "Изменить дату"

Код 1C v 8.х
 Запрос = Новый Запрос (
"ВЫБРАТЬ
| ПлатежноеПоручение.Ссылка КАК СсылкаНаДокумент
|ИЗ
| Документ.ПлатежноеПоручение КАК ПлатежноеПоручение");
Результат = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.Значение = Результат;
ТЗ = Результат;
ТЗ.Колонки.Добавить("ФлагВыгрузки");

Для каждого Стр из ТЗ цикл
Если Стр.ФлагВыгрузки = Истина Тогда
ДокОбъект = Стр.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
Конецесли;
КонецЦикла;

Но тут заново загружаются данные, что то не так я делаю подскажите как быть.
sashuly
01.04.2013 16:10Ответ № 7
в первый запрос добавь строку
| ПлатежноеПоручение.Ссылка КАК СсылкаНаДокумент,

в процедуре второй кнопки, убери запрос совсем, чтобы осталось только
Код 1C v 8.х
 
Для каждого Стр из ТЗ цикл
Если Стр.ФлагВыгрузки = Истина Тогда
ДокОбъект = Стр.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
Конецесли;
КонецЦикла;
Ermak
01.04.2013 16:13Ответ № 8
(7) sashuly, выдает ошибку

{Форма.ОбработкаОИзменениеДатыДокумента(57,21)}: Переменная не определена (ТЗ)
Для каждого Стр из <<?>>ТЗ цикл
sashuly
01.04.2013 16:44Ответ № 9
У таблицы на вашей форме есть реквизит Данные, за место ТЗ напишите имя из этого поля.

п.с. в какой конфигурации вы работаете?
Ermak
01.04.2013 18:28Ответ № 10
Всем большое спасибо все работает!
Ermak
01.04.2013 18:29Ответ № 11
Вопрос закрыт!
DJ_Serega
01.04.2013 18:34Ответ № 12
(9) sashuly, ошибка в (8) потому что у него элемент на форме не ТЗ а ТабличноеПоле1.
Поэтому:

Код 1C v 8.х
 
Для каждого Стр из ЭлементыФормы.ТабличноеПоле1.Значение цикл
Если Стр.ФлагВыгрузки = Истина Тогда
ДокОбъект = Стр.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
Конецесли;
КонецЦикла;


upd:
а вообще я бы писал так:
Код 1C v 8.х
 
МассивФлагИстина = ЭлементыФормы.ТабличноеПоле1.Значение.НайтиСтроки(Новый Структура("ФлагВыгрузки", Истина))
Для Каждого ТекСтрока Из МассивФлагИстина Цикл
ДокОбъект = ТекСтрока.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
КонецЦикла;

Изменено 01.04.13 18:36:12
Ermak
01.04.2013 18:35Ответ № 13
(12) DJ_Serega, А я просто сделал

Код 1C v 8.х
 	Для каждого Стр из ТабличноеПоле1 цикл
Если Стр.ФлагВыгрузки Тогда
ДокОбъект = Стр.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
Конецесли;
КонецЦикла;
DJ_Serega
01.04.2013 18:37Ответ № 14
(13) Ermak, Если строк 100 а документ с Истиной 1. Тогда посмотрите второй листинг в (12) Ermak
Изменено 01.04.13 18:37:35
Ermak
01.04.2013 18:40Ответ № 15
(14) DJ_Serega, А почему так? Если 100 строк то первый вариант не будет работать.
DJ_Serega
01.04.2013 18:43Ответ № 16
(15) Ermak, Будет, но будут перебираться все строки. А метод "НайтиСтроки" вернет только то что указано в структуре. Тоесть если строк 1000, а есть 1. То будет возвращена одна строчка.
И сами посудите что быстрее отработает )
А припустим, что эта одна строчка последняя. Зачем перебирать 999 строк? )
Ermak
01.04.2013 18:44Ответ № 17
Ну да это верно.
Я сейчас проверил он почему то не работает и ошибок не выдает )
DJ_Serega
01.04.2013 18:44Ответ № 18
(17) Ermak, массив? Почитайте СП по поводу НайтиСтроки )
Ermak
01.04.2013 18:46Ответ № 19
ВСе нормально, напутал *06
Ermak
01.04.2013 18:47Ответ № 20
Вот что не работает, если все строки Истина то он не перезаписывает!!!!
DJ_Serega
01.04.2013 19:03Ответ № 21
(20) Ermak, Оно только ищет ) И наденные возвращает в массив. В цикле массива запись объекта не потерялось?
Ermak
01.04.2013 19:15Ответ № 22
потерялась, когда я выбираю все строки галочками то он не изменяет дату, дата документа остается не изменой
DJ_Serega
01.04.2013 19:47Ответ № 23
(22) Ermak, он только ищет строки. Потом же ж массив нужно перебрать, получив документы, изменив и записав их. Тут же (12) DJ_Serega написано *17
Ermak
01.04.2013 22:28Ответ № 24
(23) DJ_Serega, Вы предлагаете еще добавить этот код

Код 1C v 8.х
 Для каждого Стр из ЭлементыФормы.ТабличноеПоле1.Значение цикл
Если Стр.ФлагВыгрузки = Истина Тогда
ДокОбъект = Стр.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
Конецесли;
КонецЦикла;
Ermak
02.04.2013 09:22Ответ № 25
Сегодня заметил такую ошибку, почему то документы Выгружаются в Табличное поле только с датой 02.04.2013 0:00:00, а если дата уже равна 02.04.2013 9:20:56 уже не Выгружает, как исправить?
Ermak
02.04.2013 09:26Ответ № 26
(25) Ermak, Я разобрался )
DJ_Serega
02.04.2013 10:59Ответ № 27
(24) Ermak, Во всем вопросе?
А через массив сделали или перебором всех строк?
Ermak
02.04.2013 12:57Ответ № 28
(27) DJ_Serega, Сделал через строки, про массив не разобрался, просто сегодня нужно было отдавать обработку бухгалтеру )
DJ_Serega
02.04.2013 13:21Ответ № 29
Посмотрите разберитесь на досуге с массивом. Будет выручать во многих случаях *02

з.ы.: и вопросик если решенный то "это как бы" *17
Ermak
02.04.2013 16:26Ответ № 30
Вопрос закрыт!
Ermak
02.04.2013 16:32Ответ № 31
я не понимаю этот код

Код 1C v 8.х
 МассивФлагИстина = ЭлементыФормы.ТабличноеПоле1.Значение.НайтиСтроки(Новый Структура("ФлагВыгрузки", Истина))
Для Каждого ТекСтрока Из МассивФлагИстина Цикл
ДокОбъект = ТекСтрока.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
КонецЦикла;


похож на этот

Код 1C v 8.х
  Для каждого Стр из ЭлементыФормы.ТабличноеПоле1.Значение цикл
Если Стр.ФлагВыгрузки = Истина Тогда
ДокОбъект = Стр.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
Конецесли;
КонецЦикла;


различие только в этом
Код 1C v 8.х
 МассивФлагИстина = ЭлементыФормы.ТабличноеПоле1.Значение.НайтиСтроки(Новый Структура("ФлагВыгрузки", Истина))   


почему тогда первый код только ищет а второй ищет и изменяет, не понимаю *03
DJ_Serega
02.04.2013 22:04Ответ № 32
(31) Ermak, Может я чего-то не понимаю, но с использованием метода "НайтиСтроки" все должно работать *09
Ermak
03.04.2013 10:48Ответ № 33
(32) DJ_Serega, Я смотрю мы друг друга не понимаем, вернемся назад. Я изменил код
Код 1C v 8.х
 Для каждого Стр из ЭлементыФормы.ТабличноеПоле1.Значение цикл
Если Стр.ФлагВыгрузки = Истина Тогда
ДокОбъект = Стр.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
Конецесли;
КонецЦикла;


на этот
Код 1C v 8.х
  МассивФлагИстина = ЭлементыФормы.ТабличноеПоле1.Значение.НайтиСтроки(Новый Структура("ФлагВыгрузки", Истина))
Для Каждого ТекСтрока Из МассивФлагИстина Цикл
ДокОбъект = ТекСтрока.СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Дата=Дата3;
ДокОбъект.Записать();
КонецЦикла;


и у меня перестала записывать документы когда выбираю ФлагВыгрузки = Истина все документ, вот я и спрашиваю что не так вроде код одинаковый только небольше отличие в этом
Код 1C v 8.х
  МассивФлагИстина = ЭлементыФормы.ТабличноеПоле1.Значение.НайтиСтроки(Новый Структура("ФлагВыгрузки", Истина))     
Bell
03.04.2013 12:06Ответ № 34
Если есть возможность лучше результат выгрузить в ТЧ обработки, а не в ТЗ. Отрабатывать лучше будет (надежнее)
Код 1C v 8.х
 Процедура УстановитьПометкуСвязи()

Попытка

НачатьТранзакцию();

СтрокаТЧ=ЭлементыФормы.СписокДокументов.ТекущиеДанные;

Для Каждого СтрокаТЧ из СписокДокументов Цикл

Документ=СтрокаТЧ.ВидДокумента.ПолучитьОбъект();

Если СтрокаТЧ.фл = Ложь Тогда
Документ.ФлагОбработки = Ложь;
Документ.ДатаОбработки = '00010101';
Документ.Записать(РежимЗаписиДокумента.ОтменаПроведения);
ИначеЕсли СтрокаТЧ.фл = Истина Тогда
Документ.ФлагОбработки = Истина;
Документ.ДатаОбработки = ДатаОбработки;
Документ.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
//
КонецЦикла;

ЗафиксироватьТранзакцию();

Исключение

Сообщить("Есть ошибка");

КонецПопытки


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

Изменено 03.04.13 12:09:55
Ermak
03.04.2013 12:12Ответ № 35
(34) Bell, Тут о другом идет речь )
DJ_Serega
03.04.2013 20:00Ответ № 36
(33) Ermak, А поставьте точку с запятой в конце строки "найти строки" *06
Хотя проблема вроде и не в этом поидее должна быть... И мы друг друга понимаем. Мы не можем понять, почему один и тот же код (с ваших слов, ну и видно по части кода) не работает *14

Транзакций нет?
Ermak
04.04.2013 12:40Ответ № 37
(36) DJ_Serega, это что Транзакций нет?, слово знакомое но не помню
DJ_Serega
04.04.2013 23:00Ответ № 38
(37) Ermak, В СП почитайте *07 (более детально там описано).
Что такое Транзакции, и для чего они нужны.
Ermak
18.04.2013 12:28Ответ № 39
Вопрос закрыт!
Подсказка: Вы получили ответ на свой вопрос - закройте вопрос!
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.