Как изменить дату документа 1с программно

В этой статье научимся приемами программного создания и заполнения документов в 1С 8.3, кроме того, мы узнаем, как программно записывать и проводить документ 1С,  а также узнаем, как программно открыть основную форму документа.

В этой статье научимся приемами программного создания и заполнения документов в 1С 8.3, кроме того, мы узнаем, как программно записывать и проводить документ 1С,  а также узнаем, как программно открыть основную форму документа.

Прежде чем мы начнем разбирать вопросы программной работы с документами в 1С 8.3, хочу обратить Ваше внимание, что на управляемой форме в режиме тонкого клиента мы можем программно работать (создавать, записывать и проводить) с документами только в серверном контексте. То есть, ваша процедура или функция должна выполняться под директивами &НаСервере или &НаСервереБезКонтекста.

Все примеры в этой статье я буду показывать на управляемой форме обработки, которую создал «за кадром».

Создать документ 1С программно

В моей учебной конфигурации 1С имеется простенький документ с небольшим набором реквизитов, а также с одной табличной частью.

Реквизиты документа в 1С 8.3

Для программного создания документов, я сделал обработку. У этой обработки , я разработал форму и создал команду управляемой формы, которую назвал  «Создать документ прихода», поместив её на форму обработки.

Форма обработки для создания документа

Для этой команды, я сделаю обработчики на клиенте и на сервере.

Создание обработчиков команды

В серверном обработчике мы и напишем код, который и будет создавать документ..

&НаСервере
Процедура СоздатьДокументПриходаНаСервере()

    ДокПриход = Документы.ПриходТовара.СоздатьДокумент();

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

&НаКлиенте
Процедура СоздатьДокументПрихода(Команда)
    СоздатьДокументПриходаНаСервере();
КонецПроцедуры

В этом коде я обратился к менеджеру документа ПриходТовара  (строка Документы.ПриходТовара), и использовал функцию менеджера документа СоздатьДокумент, которая и создает документ-объект. Переменная ДокПриход, которую мы создали будет иметь тип ДокументОбъект.ПриходТовара.

Следующим шагом, я присвою дату этому документу, для простоты, это будет текущая дата.

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();

Номер я присваивать не буду, потому что у объекта моего документа включено свойство Автонумерация.

Свойство автонумерация документа

В принципе, этого вполне достаточно, чтобы наш документ существовал. Но создав его при помощи функции СоздатьДокумент, мы не записали его непосредственно в базу. После выполнения кода выше, ни какого документа в базе не появится!

Записать документ 1С программно

Для того, чтобы документ 1С появился в базе, его необходимо записать.  Делается это при помощи метода документа-объекта Записать. Этот метод позволяет и записать, и провести документ. Он имеет два параметра, которые я разберу ниже. Но, метод Записать также можно использовать и без параметров, тогда он будет просто записывать документ. Что мы и сделаем.

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Записать();

Все теперь документ появится в базе.

Мы его можем создать, и это будет абсолютно пустой документ, без всяких реквизитов и без заполненной табличной частью.

Создание пустого документа

Для того, чтобы что-то в нем появилось, нам необходимо заполнить этот документ.

Заполнить документ 1С программно

У нашего документа два реквизита «шапки» – Склад и Комментарий. Создадим на форме обработки реквизит управляемой формы Склад с соответствующим типом, для последующей записи его в шапку документа, а реквизит комментарий заполним в ручную.

Создание реквизита управляемой формы

Присвоим реквизитам созданного объекта-документа нужные значения, просто обратившись через точку к этим реквизитам.

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Склад = Склад;
ДокПриход.Комментарий = "#Документ создан автоматически обработкой"
ДокПриход.Записать();

Так мы заполнили реквизиты «шапки», но у нас имеется еще табличная часть документа, необходимо заполнить и её. Для её заполнения, я создам таблицу значений в качестве реквизита формы обработки, и помещу её на эту форму.

Таблица значений на управляемой формеМы будем в цикле обходить эту таблицу значений, создавая в каждой итерации цикла новую строку табличной части документа и заполняя её данными.

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Склад = Склад;
ДокПриход.Комментарий = "#Документ создан автоматически обработкой";
Для Каждого стрТЗ Из ТЗ Цикл
    НовСтрТЧДокумента = ДокПриход.СписокТоваров.Добавить();
    НовСтрТЧДокумента.Номенклатура = стрТЗ.Номенклатура;
    НовСтрТЧДокумента.Количество   = стрТЗ.Количество;
    НовСтрТЧДокумента.Цена         = стрТЗ.Цена;
    НовСтрТЧДокумента.Сумма = НовСтрТЧДокумента.Количество*НовСтрТЧДокумента.Цена;
КонецЦикла;
ДокПриход.Записать();

В этом коде я обращаюсь к табличной части документа-объекта посредством точки (строка ДокПриход.СписокТоваров), получаю табличную часть этого объекта, и используя метод Добавить, создаю новую строку табличной части. А потом заполняю реквизиты табличной части документа данными из таблицы значений. Поскольку у нас названия реквизитов табличной части и таблицы значений совпадают, мы можем упростить код заполнения табличной части, используя метод ЗаполнитьЗначенияСвойств.

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


Всё! Мы можем смело создать документ, который будет заполнен.

Создание и заполнение документа 1С

Создание и заполнение документа 1С

Провести документ 1С программно

Все документы, которые мы создавали ранее были не проведены. Если мы хотим, чтобы документ был записан проведенным, то необходимо записывать его немного по-другому. Если раньше мы использовали метод Записать объекта документа без параметров, то теперь необходимо применять параметры этого метода. Данный метод имеет следующий синтаксис.

Записать(<РежимЗаписи>,<РежимПроведения>)

Оба параметра это системные перечисления. Первый параметр это перечисление РежимЗаписиДокумента, которое может принимать следующие значения:

РежимЗаписиДокумента.Запись
РежимЗаписиДокумента.Проведение
РежимЗаписиДокумента.ОтменаПроведения

Т.е. мы можем записать документ, провести документ и отменить проведение документа.

Во втором параметр РежимПроведения необходимо указывать системное перечисление РежимПроведениеДокумента, которое может принимать следующие значения:

РежимПроведенияДокумента.Неоперативный
РежимПроведенияДокумента.Оперативный

Т.е. мы можем провести документ как в оперативном режиме, так и в неоперативном. Если этот параметр не указан, то документ проводится в неоперативном режиме.

Изменим запись нашего документа: пусть он проводится в оперативном режиме.

ДокПриход.Записать(РежимЗаписиДокумента.Проведение,
                   РежимПроведенияДокумента.Оперативный);

Теперь документ будет сразу проведен при создании.

Изменить документ 1С программно

Часто возникают задачи, когда нужно поменять уже созданный документ, или провести документ, который был только записан. Для этого необходимо из ссылки на документ получить его объект. Для примера, я опять создам «за кадром» новую обработку, на форме которой размещу ссылку на документ, поле с типом Склад и команду. При выполнение этой команды, будет меняться склад документа, а потом этот документ будет проводиться.

Обработка изменения документа

Как и в прошлый раз, я создам обработчик команды на сервере и на клиенте. И в серверном обработчике напишу код получения объекта из ссылки документа.

&НаСервере
Процедура ИзменитьДокументНаСервере()

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

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

&НаКлиенте
Процедура ИзменитьДокумент(Команда)
    ИзменитьДокументНаСервере();
КонецПроцедуры

Мы получили объект документа, используя метод ссылки на документ ПолучитьОбъект. Имейте в виду, что этот метод можно использовать или на сервере, или клиенте в режиме толстого клиента.  Переменная, которую мы создали будет иметь тип ДокументОбъект.ПриходТовара.

Изменим склад и проведем документ. В этот раз проведем в неоперативном режиме.

ДокОбъект = ДокументПрихода.ПолучитьОбъект();
ДокОбъект.Склад = Склад;
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение,
                   РежимПроведенияДокумента.Неоперативный);


Открыть документ 1С программно

Научимся открывать документ 1С программно. Для этого мы доработаем предыдущую обработку: после изменения документа откроем основную форму этого объекта для просмотра и возможного редактирования. Для открытия формы документа, мы будем использовать метод  ОткрытьФорму, в котором будем использовать параметр Ключ, где укажем ссылку на открываемый документ.

&НаСервере
Процедура ИзменитьДокументНаСервере()
    ДокОбъект = ДокументПрихода.ПолучитьОбъект();
    ДокОбъект.Склад = Склад;
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение,
                       РежимПроведенияДокумента.Неоперативный);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьДокумент(Команда)
    ИзменитьДокументНаСервере();
    ПараметрыОткрытия = Новый Структура("Ключ",ДокументПрихода);
    ОткрытьФорму("Документ.ПриходТовара.ФормаОбъекта",
                 ПараметрыОткрытия,,,,,,
                 РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры

Если мы сейчас выполним этот код, то откроется форма документа, с уже измененным реквизитом Склад.

Обработка изменения документа

Более подробно и основательно разработка в 1С дается в моей книге: «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Ermak
01.04.2013 12:52 Прочитано: 2493

Есть созданные документы у которых нужно изменить дату, вот что я делаюКод 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

Вопрос закрыт!

Подсказка: Для выделения Кода используйте (в редакторе).

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

/// Как выбрать и упорядочить документы за период
/// в 1с 8.3, 8.2
 
&НаСервере
Процедура КакВыбратьИУпорядочитьДокументыЗаПериодНаСервере()
 
    // найдём все документы поступления еды за 2014 год
    // упорядочив их по возрастанию даты
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Дата МЕЖДУ &НачДата И &КонДата
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    Запрос.УстановитьПараметр("НачДата", '20140101');
    Запрос.УстановитьПараметр("КонДата", '20141231');
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл
        Сообщить(ВыборкаДокументов.Ссылка);
    КонецЦикла;
 
КонецПроцедуры
 
/// Как найти документ по номеру в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиДокументПоНомеруНаСервере()
 
    // найдём поступление еды № ВМБП-000005 за 2014 год
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Дата МЕЖДУ &НачДата И &КонДата И
        |   Номер = &ВыбНомер";
 
    Запрос.УстановитьПараметр("НачДата", '20140101');
    Запрос.УстановитьПараметр("КонДата", '20141231');
    Запрос.УстановитьПараметр("ВыбНомер", "ВМБП-000005");
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Если ВыборкаДокументов.Следующий() Тогда
        Сообщить(ВыборкаДокументов.Ссылка);        
    Иначе
        Сообщить("Документ с таким номером не существует!");
    КонецЕсли;
 
КонецПроцедуры
 
/// Как найти документы по реквизиту в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиДокументПоРеквизитуНаСервере()
 
    // найдём все документы поступления еды
    // от поставщика ООО "Поле"
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка,
        |   Поставщик
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Поставщик = &ВыбПоставщик
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    Запрос.УстановитьПараметр(
        "ВыбПоставщик",
        Справочники.Поставщики.НайтиПоНаименованию("ООО ""Поле""")
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл        
        Сообщить(
            Строка(ВыборкаДокументов.Ссылка) + " " + 
            ВыборкаДокументов.Поставщик
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как выбрать все документы, которые не проведены и
/// не помечены на удаление в 1с 8.3, 8.2
 
&НаСервере
Процедура КакВыбратьВсеДокументыКоторыеНеПроведеныИНеПомеченыНаУдалениеНаСервере()
 
    // найдём не проведенные и не помеченные на удаление
    // документы поступления еды
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка,
        |   Проведен,
        |   ПометкаУдаления        
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Проведен = ЛОЖЬ И
        |   ПометкаУдаления = ЛОЖЬ
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл
        Сообщить(
            Строка(ВыборкаДокументов.Ссылка) + " " + 
            ВыборкаДокументов.Проведен + " " +
            ВыборкаДокументов.ПометкаУдаления
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как найти подчиненные документы в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиПодчиненныеДокументыНаСервере()
 
    // Рассмотрим работу с подчиненными (связанными) документами
    // на примере документов: ПоступлениеТоваровУслуг и СчетФактураПолученный.
 
    // Документ СчетФактураПолученный вводится на основании документа
    // ПоступлениеТоваровУслуг, то есть счет фактура является подчиненной
    // по отношению к поступлению.
 
    // Факт подчиненности обычно (в типовых) фиксируется в самом подчиненном
    // документе через табличную часть ДокументыОснования.
    // Почему через табличную часть? Потому что один документ может зависеть
    // (быть подчиненным) сразу от нескольких родителей (оснований).
 
    // Пример №1.
    // У нас есть ссылка на поступление товаров и услуг. Требуется найти
    // счёт-фактуры, которые были введены на основании этого поступления.
    // В дереве подчиненности эти фактуры будут подчинены (зависимы) от
    // документа поступления.
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Ссылка
        |ИЗ
        |    Документ.СчетФактураПолученный.ДокументыОснования КАК
        |    СчетФактураПолученныйДокументыОснования
        |ГДЕ
        |    СчетФактураПолученныйДокументыОснования.ДокументОснование =
        |    &ВыбПоступление";
 
    Запрос.УстановитьПараметр("ВыбПоступление", 
        Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("0000-000004", '20160101')
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        ПодчиненнаяФактура = ВыборкаДетальныеЗаписи.Ссылка;
        Сообщить(ПодчиненнаяФактура);
    КонецЦикла;
 
    // Пример №2.
    // У нас есть ссылка на счет-фактуру полученную. Требуется найти,
    // документы, на основании которых она была введена (родителей).
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДокументОснование
        |ИЗ
        |    Документ.СчетФактураПолученный.ДокументыОснования КАК
        |    СчетФактураПолученныйДокументыОснования
        |ГДЕ
        |    СчетФактураПолученныйДокументыОснования.Ссылка =
        |    &ВыбСчетФактура";
 
    Запрос.УстановитьПараметр("ВыбСчетФактура",
        Документы.СчетФактураПолученный.НайтиПоНомеру("0000-000007", '20160101')
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        РодительФактуры = ВыборкаДетальныеЗаписи.ДокументОснование;
        Сообщить(РодительФактуры);
    КонецЦикла;
 
КонецПроцедуры
 
///  Как перебрать (перечислить) строки табличной части документа в 1с 8.3, 8.2
 
&НаСервере
Процедура КакПеречислитьСтрокиИзТабличнойЧастиДокументаНаСервере()
 
    // У документа ПоступлениеЕды есть табличная часть 'Еда'.
    // У этой табличной части есть колонки: Номенклатура, Количество,
    // Сумма.
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');    
 
    // перечислим строки табличной части этого документа
 
    // при помощи объектной техники
 
    Для Каждого Строка Из ПоступлениеСсылка.Еда Цикл
        Сообщить(
            Строка.Номенклатура.Наименование + " " +
            Строка.Количество + " шт. " + 
            Строка.Сумма + " руб."
        );
    КонецЦикла;
 
    // при помощи запроса    
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ПоступлениеЕдыЕда.Номенклатура,
        |   ПоступлениеЕдыЕда.Количество,
        |   ПоступлениеЕдыЕда.Сумма
        |ИЗ
        |   Документ.ПоступлениеЕды.Еда КАК ПоступлениеЕдыЕда
        |ГДЕ
        |   ПоступлениеЕдыЕда.Ссылка = &ВыбПоступление";
 
    Запрос.УстановитьПараметр("ВыбПоступление", ПоступлениеСсылка);
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
 
        Сообщить(
            ВыборкаДетальныеЗаписи.Номенклатура.Наименование + " " +
            ВыборкаДетальныеЗаписи.Количество + " шт. " + 
            ВыборкаДетальныеЗаписи.Сумма + " руб."
        );
 
    КонецЦикла;
 
КонецПроцедуры
 
&НаСервере
Процедура СозданиеИИзменениеДокументовНаСервере()
 
    /// Как создать новый документ в 1с 8.3, 8.2
 
    // создадим новый документ поступление еды
    Поступление = Документы.ПоступлениеЕды.СоздатьДокумент();
    // заполним шапку документа
    Поступление.Дата = ТекущаяДата();
    Поступление.Поставщик = 
        Справочники.Поставщики.НайтиПоНаименованию(
            "ООО ""Кузбас"""
        );
    Поступление.Склад =
        Справочники.Склады.НайтиПоНаименованию(
            "Основной"
        );
    // заполним табличную часть Еда
    НоваяСтрока = Поступление.Еда.Добавить();
    НоваяСтрока.Номенклатура =
        Справочники.Еда.НайтиПоНаименованию(
            "Банан"
        );
    НоваяСтрока.Количество = 10;
    НоваяСтрока.Сумма = 550;
 
    /// Как записать документ в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.Запись);
 
    /// Как провести документ в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как отменить проведение документа в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.ОтменаПроведения);
 
    /// Как внести изменения в документ по ссылке в 1с 8.3, 8.2
 
    // зачастую у нас есть только ссылка на документ
    // и чтобы по ней получить сам объект документа
    // для изменения нужно вызывать метод ПолучитьОбъект
 
    // найдём документ продажа еды под номером ВМБП-000001
    // для лаконичности примера воспользуемся не запросом,
    // а объектной техникой
 
    СсылкаНаПродажу = Документы.ПродажаЕды.НайтиПоНомеру(
        "ВМБП-000001",
        '20141231' // поиск среди документов 2014 года
     );
    // нам вернули не сам документ, а ссылку (указатель) на него
 
    // проверим - нашёлся ли вообще документ    
    Если СсылкаНаПродажу.Пустая() Тогда
        Сообщить("Документ не найден.");
    Иначе
        // получим сам документ по ссылке
        Продажа = СсылкаНаПродажу.ПолучитьОбъект();
        // вот его уже можно изменять и записывать
        Продажа.Клиент = 
            Справочники.Клиенты.НайтиПоНаименованию(
                "Пётр"
            );
        Продажа.Записать();
    КонецЕсли;
 
    /// Как получить пустую ссылку типа документ в 1с 8.3, 8.2
 
    ПустаяСсылка = Документы.ПродажаЕды.ПустаяСсылка();
    Если ПустаяСсылка.Пустая() Тогда
        Сообщить("Ссылка действительно пустая.");
    КонецЕсли;
 
    /// Как скопировать существующий документ в 1с 8.3, 8.2
 
    // скопируем найденный документ на продажу и запишем
    // как новый документ от сегодняшнего числа
 
    КопияПродажи = СсылкаНаПродажу.Скопировать();
    КопияПродажи.Дата = ТекущаяДата();
    КопияПродажи.Комментарий = "Копия документа " + 
        Строка(СсылкаНаПродажу);
    // запишем и проведём документ
    КопияПродажи.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как заблокировать документ перед изменениями 
    /// в 1с 8.3, 8.2
 
    // выполним блокировку документа
    // от изменения другими режимами или пользователями
 
    Продажа = СсылкаНаПродажу.ПолучитьОбъект();
    Если Не Продажа.Заблокирован() Тогда
        Продажа.Заблокировать();
        // тут идёт какой-то долгий алгоритм
        // в результате которого мы меняем
        // заблокированный элемент
        Продажа.Комментарий = "Документ изменён.";
        Продажа.Записать();
        // и только потом освобождаем его
        // для других режимов и пользователей
        Продажа.Разблокировать();
    КонецЕсли;
 
    /// Как создать новый документ на основании другого объекта
    /// в 1с 8.3, 8.2
 
    // создадим документ продажа на основании поступления
    // скопировав из поступления табличную часть
 
    // в модуле документа ПродажаЕды я определил процедуру
    // ОбработкаЗаполнения, которая обрабатывает ситуации
    // когда мы заполняем один элемент на основании
    // данных другого (см. в базе для скачивания)
 
    ПродажаНаОсновании = Документы.ПродажаЕды.СоздатьДокумент();
    ПродажаНаОсновании.Дата = ТекущаяДата();
    ПродажаНаОсновании.Комментарий =
        "Документ введён на основании " + Строка(Поступление.Ссылка);
    ПродажаНаОсновании.Заполнить(Поступление.Ссылка);
    ПродажаНаОсновании.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как пометить на удаление документ в 1с 8.3, 8.2
 
    ПродажаНаОсновании.УстановитьПометкуУдаления(Истина);
    // метод Записать вызывать не нужно
 
КонецПроцедуры
 
/// Как найти и изменить программно движения документа
/// по регистрам в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиИИзменитьДвиженияДокументаНаСервере()
 
    // предположим у нас есть ссылка на проведенный
    // документ поступления еды № ВМБП-000002
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');
 
    // мы знаем, что этот документ делает записи по
    // двум регистрам:
    // - регистр накопления "ЗапасЕды"
    // - регистр бухгалтерии "Хозрасчетный"
 
    // наша задача: найти записи по регистру "ЗапасЕды"
    // изменить их (например, удвоим количество)
    // и записать вместо старых
 
    // используем объектную технику получения движений,
    // ведь мы будем их изменять
 
    Поступление = ПоступлениеСсылка.ПолучитьОбъект();
 
    // получим набор записей этого документа в регистр ЗапасыЕды
    НаборЗаписей = Поступление.Движения.ЗапасыЕды;
 
    // прочитаем записи из базы данных
    НаборЗаписей.Прочитать();
 
    Для Каждого Запись Из НаборЗаписей Цикл
 
        // выведем старые значения
        Сообщить(
            Строка(Запись.ВидДвижения) + " " +
            Запись.Еда + " " + Запись.Количество
        );
 
        // изменим запись, удвоив количество
        Запись.Количество = Запись.Количество * 2;
 
    КонецЦикла;
 
    // добавим новую запись
    НоваяЗапись = НаборЗаписей.ДобавитьПриход();    
    НоваяЗапись.Склад = 
        Справочники.Склады.НайтиПоНаименованию("Основной");
    НоваяЗапись.Еда = 
        Справочники.Еда.НайтиПоНаименованию("Банан");
    НоваяЗапись.Количество = 3;
    НоваяЗапись.Период = ТекущаяДата();
 
    // разом запишем набор записей
    НаборЗаписей.Записать(
        Истина // удалим старые движения и запишем вместо них новые
    );
 
    // теперь движения документа № ВМБП-000002 отличаются от тех,
    // что были записаны документом при проведении
    // чтобы вернуть их к начальному виду - нужно
    // перепровести документ
 
КонецПроцедуры
 
/// Как прочитать движения документа по регистрам запросом
/// в 1с 8.3, 8.2
 
&НаСервере
Процедура КакПрочитатьДвиженияДокументаЗапросомНаСервере()
 
    // этот приём используется, если не требуется изменять
    // найденные записи    
 
    // предположим у нас есть ссылка на проведенный
    // документ поступления еды № ВМБП-000002
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');
 
    // мы знаем, что этот документ делает записи по
    // двум регистрам:
    // - регистр накопления "ЗапасЕды"
    // - регистр бухгалтерии "Хозрасчетный"
 
    // прочитаем записи по регистру "ЗапасЕды" запросом
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ЗапасыЕды.НомерСтроки,
        |   ЗапасыЕды.ВидДвижения,
        |   ЗапасыЕды.Еда,
        |   ЗапасыЕды.Количество
        |ИЗ
        |   РегистрНакопления.ЗапасыЕды КАК ЗапасыЕды
        |ГДЕ
        |   ЗапасыЕды.Регистратор = &ВыбРегистратор
        |
        |УПОРЯДОЧИТЬ ПО
        |   ЗапасыЕды.НомерСтроки";
 
    Запрос.УстановитьПараметр("ВыбРегистратор", ПоступлениеСсылка);
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Сообщить(
            "#" + ВыборкаДетальныеЗаписи.НомерСтроки +
            " " + ВыборкаДетальныеЗаписи.ВидДвижения +
            " " + ВыборкаДетальныеЗаписи.Еда + 
            " " + ВыборкаДетальныеЗаписи.Количество
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как изменить проведенный документ, не меняя его
/// движений (проводок) в 1с 8.3, 8.2
 
&НаСервере
Процедура КакИзменитьПроведенныйДокументНеМеняяЕгоДвиженийНаСервере()
 
    // бывает так, что есть проведенный документ
    // в уже закрытом периоде и нужно изменить
    // некоторое поле документа, но так чтобы
    // не поменялись проводки документа
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000005", '20141231');
 
    // Изменим количество в табличной части этого документа
    // на 1, но чтобы проводки (движения) остались прежними
 
    Поступление = ПоступлениеСсылка.ПолучитьОбъект();
 
    Для Каждого Строка Из Поступление.Еда Цикл
        Строка.Количество = 1;
    КонецЦикла;
 
    // если сейчас просто записать документ
    // изменятся его проводки, ведь он уже проведён
 
    // но если установить флаг Загрузка
    Поступление.ОбменДанными.Загрузка = Истина;    
 
    // то можно записать проведенный документ
    // без повторного проведения
 
    Поступление.Записать();
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьПродажуПоНомеру(Номер, Интервал)
 
    Возврат Документы.ПродажаЕды.НайтиПоНомеру(
        Номер, Интервал
    );
 
КонецФункции
 
/// Как открыть форму существующего документа 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоДокумента(Команда)
 
    СсылкаНаДокумент = ПолучитьПродажуПоНомеру("ВМБП-000006", '20141231');
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
 
    ОткрытьФорму(
        "Документ.ПродажаЕды.ФормаОбъекта", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму выбора документа и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораДокумента(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораДокумента",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Документ.ПродажаЕды.ФормаВыбора",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораДокумента(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Был выбран документ " + Результат);
    КонецЕсли;
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция НайтиПоставщикаПоИмени(Имя)
 
    Возврат Справочники.Поставщики.НайтиПоНаименованию(
        Имя
    );
 
КонецФункции
 
/// Как открыть форму списка (журнал) документов и
/// с отбором по реквизиту в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСпискаДокументовСОтбором(Команда)
 
    // откроем список поступлений, оставив
    // только те, что от поставщика ООО "Поле"
 
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Поставщик",
        НайтиПоставщикаПоИмени("ООО ""Поле"""));
 
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
 
    ОткрытьФорму(
        "Документ.ПоступлениеЕды.ФормаСписка",
        ПараметрыФормы
    );
 
КонецПроцедуры
 
/// Как открыть форму только что созданного, но ещё
/// не записанного документа в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоДокумента(Команда)
 
    // получаем форму нового документа
    ФормаНовогоДокумента = ПолучитьФорму(
        "Документ.ПоступлениеЕды.ФормаОбъекта",,, Истина); 
 
    // делаем копию её данных (так как напрямую их менять
    // нельзя)
    КопияДанныхФормы = ФормаНовогоДокумента.Объект;
 
    // заполняем эти данные на сервере
    ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);    
 
    // копируем заполненные данные в исходную форму
    КопироватьДанныеФормы(КопияДанныхФормы,
        ФормаНовогоДокумента.Объект);
 
    // показываем форму нового заполненного
    // документа пользователю
    ФормаНовогоДокумента.Открыть();
 
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
 
    // преобразуем данные формы в документ
    Поступление = ДанныеФормыВЗначение(ДанныеФормы,
        Тип("ДокументОбъект.ПоступлениеЕды"));
 
    // заполним только табличную часть
    НоваяСтрока = Поступление.Еда.Добавить();
    НоваяСтрока.Номенклатура =
        Справочники.Еда.НайтиПоНаименованию(
            "Банан"
        );
    НоваяСтрока.Количество = 10;
    НоваяСтрока.Сумма = 550;
 
    // преобразуем документа обратно в данные формы
    ЗначениеВДанныеФормы(Поступление, ДанныеФормы);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Как установить дату документа?

Автор Ciz, 29 янв 2021, 15:09

0 Пользователей и 1 гость просматривают эту тему.

Есть код который берет значения из таблицы Excel и преобразовывает их в документ ПКО:


...
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл         

Для каждого СтрокаМассив из МассивКолонок Цикл

ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
// Получение имени колонки
ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;

НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();

Если ИмяКолонки = "Дата" Тогда
//убираем лишние проблемы (работает)
ТекущееЗначение = СтрЗаменить(ТекущееЗначение,Символы.НПП," ");
ТекущееЗначение = СтрЗаменить(ТекущееЗначение,"  "," ");
//добавляем секунды
ТекущееЗначение = ТекущееЗначение + ":00";
//форматируем строку как дату (работает)
ТекущееЗначение = Дата(ТекущееЗначение);
//переводим дату в формат ГГГГММДДччммсс (работает)
ТекущееЗначение = Формат(ТекущееЗначение, "ДФ='yyyyMMddHHmmss'");
// ставим дату документа как текущее значение (не работает)
// игнорирует все изменения, пытается использовать ТекущееЗначение как оно было изначально
НовыйДокумент.Дата = ТекущееЗначение;
Сообщить("Ставим дату: " + ТекущееЗначение + " НовыйДокумент.Дата: " + НовыйДокумент.Дата);
КонецЕсли;
...
Если ИмяКолонки = "Приход наличными" Тогда
НовыйДокумент.СуммаДокумента = ТекущееЗначение;
КонецЕсли;

Если НовыйДокумент.СуммаДокумента > 0 Тогда
// Запись и проведение документа
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
КонецЕсли;
КонецЦикла;


Вместо того, чтобы установить дату как положено выдает следующее:

ЦитироватьСтавим дату: 20210128173000 НовыйДокумент.Дата: 28.01.2021 17:30:00
Поступление наличных  от 01.01.0001 0:00:00 невозможно поместить в запрещенный период.

Дате  соответствует запрет изменения данных для пользователя «Администратор» по 31.12.2017 (установлена общая дата запрета)

Установка остальных параметров (сумма, счет учета, организация) работает как положено.


аааа, у вас запись внутри цикла стоит, ее надо из цикла вынести

        Если НовыйДокумент.СуммаДокумента > 0 Тогда
                    // Запись и проведение документа       
                    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
                    Сообщить(«Создан и заполнен документ » + Строка(НовыйДокумент));
                КонецЕсли;
примерно так (код конечно отпадный)

Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл         

                        НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();

            Для каждого СтрокаМассив из МассивКолонок Цикл

                                ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
                // Получение имени колонки
                ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;

                            Если ИмяКолонки = "Дата" Тогда
                    //убираем лишние проблемы (работает)
                    ТекущееЗначение = СтрЗаменить(ТекущееЗначение,Символы.НПП," ");
                    ТекущееЗначение = СтрЗаменить(ТекущееЗначение,"  "," ");
                    //добавляем секунды
                    ТекущееЗначение = ТекущееЗначение + ":00";
                    //форматируем строку как дату (работает)
                    ТекущееЗначение = Дата(ТекущееЗначение);
                    //переводим дату в формат ГГГГММДДччммсс (работает)
                    ТекущееЗначение = Формат(ТекущееЗначение, "ДФ='yyyyMMddHHmmss'");
                    // ставим дату документа как текущее значение (не работает)
                    // игнорирует все изменения, пытается использовать ТекущееЗначение как оно было изначально
                    НовыйДокумент.Дата = ТекущееЗначение;
                    Сообщить("Ставим дату: " + ТекущееЗначение + " НовыйДокумент.Дата: " + НовыйДокумент.Дата);
                КонецЕсли;
...
                Если ИмяКолонки = "Приход наличными" Тогда
                    НовыйДокумент.СуммаДокумента = ТекущееЗначение;
                КонецЕсли;

    КонецЦикла;

Если НовыйДокумент.СуммаДокумента > 0
и ЗначениеЗаполнено(НовыйДокумент.Дата) Тогда
                // Запись и проведение документа       
                НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
                Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
            КонецЕсли;

      КонецЦикла;

если помогло нажмите: Спасибо!


Цитата: LexaK от 29 янв 2021, 15:25
аааа, у вас запись внутри цикла стоит, ее надо из цикла вынести

        Если НовыйДокумент.СуммаДокумента > 0 Тогда
                    // Запись и проведение документа       
                    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
                    Сообщить(«Создан и заполнен документ » + Строка(НовыйДокумент));
                КонецЕсли;
примерно так (код конечно отпадный)

Спасибо, так работает, но обрабатывает только последнюю строку в таблице. Видимо опять что-то не то.

Вот полный цикл:

Если МассивКолонок.Количество() <> 0 Тогда
// Переменная СтрокаОтсчета - номер строки в Excel, с которой начинается заполнение
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл         

НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();

Для каждого СтрокаМассив из МассивКолонок Цикл

ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
// Получение имени колонки
ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;

Если ИмяКолонки = "Дата" Тогда
ТекущееЗначение = СтрЗаменить(ТекущееЗначение,Символы.НПП," ");
ТекущееЗначение = СтрЗаменить(ТекущееЗначение,"  "," ");
ТекущееЗначение = ТекущееЗначение + ":00";
ТекущееЗначение = Дата(ТекущееЗначение);
ТекущееЗначение = Формат(ТекущееЗначение, "ДФ='yyyyMMddHHmmss'");
НовыйДокумент.Дата = ТекущееЗначение;
Сообщить("Ставим дату: " + ТекущееЗначение + " НовыйДокумент.Дата: " + НовыйДокумент.Дата);
КонецЕсли;

НовыйДокумент.Ответственный = ПараметрыСеанса.ТекущийПользователь;
НовыйДокумент.Комментарий = "Загружено из файла " + Объект.ФайлExcel;
НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
НовыйДокумент.Организация = Справочники.Организации.ОрганизацияПоУмолчанию();
НовыйДокумент.ВидОперации = Перечисления.ВидыОперацийПКО.РозничнаяВыручка;
НовыйДокумент.СчетКасса = ПланыСчетов.Хозрасчетный.КассаОрганизации;

Если ИмяКолонки = "Приход наличными" Тогда
НовыйДокумент.СуммаДокумента = ТекущееЗначение;
КонецЕсли;

КонецЦикла;

Если НовыйДокумент.СуммаДокумента > 0
и ЗначениеЗаполнено(НовыйДокумент.Дата) Тогда
// Запись и проведение документа       
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
КонецЕсли;

КонецЦикла;
Иначе
Сообщить("Ошибка в файле Excel, обработка невозможна!");
КонецЕсли;


так у вас
  ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
текст, строка
и вы его сразу присваиваете Сумме. здесь
   Если ИмяКолонки = «Приход наличными» Тогда
               НовыйДокумент.СуммаДокумента = ТекущееЗначение;
    КонецЕсли;

не всегда ТЕКСТ правильно предобразовывается в число, проверьте что у вас с Суммой, примерно так

Если НовыйДокумент.СуммаДокумента > 0
            и ЗначениеЗаполнено(НовыйДокумент.Дата) Тогда
            // Запись и проведение документа       
            НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
            Сообщить(«Создан и заполнен документ » + Строка(НовыйДокумент));
Иначе
Сообщить(«Сумма документа: » + НовыйДокумент.СуммаДокумента + «, Дата: » + НовыйДокумент.Дата);
  КонецЕсли;

если помогло нажмите: Спасибо!


Цитата: LexaK от 29 янв 2021, 16:10
так у вас
  ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
текст, строка
и вы его сразу присваиваете Сумме. здесь
   Если ИмяКолонки = «Приход наличными» Тогда
               НовыйДокумент.СуммаДокумента = ТекущееЗначение;
    КонецЕсли;

Действительно. Сделал так

Если ИмяКолонки = "Приход наличными" Тогда
ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;
                    НовыйДокумент.СуммаДокумента = ТекущееЗначение;
                КонецЕсли;

Если я правильно понимаю, то в Value хранится просто цифровое значение без пробелов и лишних символов.


ЦитироватьЕсли я правильно понимаю, то в Value хранится просто цифровое значение без пробелов и лишних символов.

да ХЗ, всегда Текст брали,
если получается используйте Value
самое главное, что с результатом, документы создаются?

если помогло нажмите: Спасибо!


Цитата: LexaK от 29 янв 2021, 17:23самое главное, что с результатом, документы создаются?

Да, создаются. Сейчас пытаюсь избавиться от лишнего цикла, с ним слишком медленно работает.

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

Если ОткудаВыгружаем = 0 Тогда
ОткудаВыгружаем = 1;
ИначеЕсли ОткудаВыгружаем = 1 Тогда
ОткудаВыгружаем = 3;
Иначе
Сообщить("Необходимо указать с какого сайта была выгружена таблица Excel");
Возврат;
КонецЕсли;

ДатаДокументаНомерКолонки = -1;
Для КолонкаОтсчета = 1 по КоличествоКолонок Цикл
ИмяКолонки = Excel.Cells(ОткудаВыгружаем, КолонкаОтсчета).Text;
// Удаление лишних пробелов из имен колонок
ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ","");
НовСтрока = МассивКолонок.Добавить();
НовСтрока.НомерКолонки = КолонкаОтсчета;
НовСтрока.НазваниеКолонки = ИмяБезПробелов;
Если ИмяБезПробелов = "Датаивремясозданиядокумента" или ИмяБезПробелов = "Дата" Тогда
ДатаДокументаНомерКолонки = НовСтрока.НомерКолонки; // определяем номер колонки с датой
КонецЕсли;
//Сообщить(ИмяБезПробелов);
КонецЦикла;

Сообщить(ДатаДокументаНомерКолонки);

Если ДатаДокументаНомерКолонки = -1 Тогда
Сообщить("Отсутствует колонка 'Дата', обработка невозможна.");
Возврат;
КонецЕсли;


ЦитироватьДа, работает. Сейчас пытаюсь упросить цикл, слишком уж медленно выполняется.

есссстествено, нормальные прогеры так данные из Екселя не грузят.

одной командой читаете Ексель в ТабличныйДокумент
ДанныеФайла.Прочитать(ПолныйПутьФайлаЕксель);

затем ТабДок можно перегнать/преобразовать в ТаблицуЗначений
по этой ТЗ ОДНИМ запросом, по колонкам с Кодами/Артикулами/Наименованиями  найти все ссылочные элементы

и уже по подготовленным данным быстренько создать документы!

если помогло нажмите: Спасибо!


LexaK,

Цитата: LexaK от 29 янв 2021, 18:00есссстествено, нормальные прогеры так данные из Екселя не грузят.

Ну я начинающий, всего неделю обработки пишу. Пробовал через Табличный Документ, но не вышло, поэтому делаю таким вот образом.

Добавлено: 29 янв 2021, 19:08


Еще вопрос. Как установить значение в строку «Склад»? Не могу найти функцию.


ЦитироватьКак установить значение в строку «Склад»? Не могу найти функцию.

в вашем случае, примерно так

Если ИмяКолонки = «Склад» Тогда
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию(ТекущееЗначение);
или
НовыйДокумент.Склад = Справочники.Склады.НайтиПоКоду(ТекущееЗначение);

в зависимости что у вас в колонке Склад, код или название склада!

если помогло нажмите: Спасибо!


  1. Добрый день Всем!
    Как можно изменить выбирая несколько документов дату и времени?


  2. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Конкретизируйте вопрос, пожалуйста.


  3. nbIpKuH_BaH9I

    Online

    nbIpKuH_BaH9I
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    8.123
    Симпатии:
    550
    Баллы:
    204


  4. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

  5. Есть журнал документов, нужно выделить несколько документов и изменить дату и времени!
    Создал реквизит в форме документа ДатаДляУст и команду УстановитьДатуДляВыделеных

    код

    &НаКлиенте
    Процедура УстановитьДатуДляВыделеных(Команда)
        // Спросим дату и время у пользователя
        //ДатаНапоминания = РабочаяДата;
        Если не ЗначениеЗаполнено(ДатаДляУст)Тогда
            Подсказка = "Введите дату и время";
            ЧастьДаты = ЧастиДаты.ДатаВремя;
            Если ВвестиДату(ДатаДляУст, Подсказка, ЧастьДаты) Тогда
                Элементы.ДатаДляУст.Видимость = Истина;
            КонецЕсли;
        КонецЕсли;
       
        // определение выделенных документ
        //Элементы.Список.ВыделенныеСтроки
       
        //установка для выделенных док дату и времени
        УстановитьДатыВремяДляДок(Элементы.Список.ВыделенныеСтроки,ДатаДляУст);
        Элементы.Список.Обновить();
       
    КонецПроцедуры
    
    
    &НаСервереБезКонтекста
    Процедура УстановитьДатуДляДок(Знач МассивДок, НужнаяДата) 
       
        ДельтаОтНачалаДня = НужнаяДатаВремя - Дата (1,1,1);
        Для каждого СсылкаНаДок Из МассивДок Цикл
            ОбъектДок = СсылкаНаДок.ПолучитьОбъект();
            Объект.Дата = НачалоДня(ОбъектДок.Дата)+ДельтаОтНачалаДня;
            ОбъектДок.Записать();
           
        КонецЦикла;
       
       
    КонецПроцедуры
    

    ошибки

    {ЖурналДокументов.ПоступлениеГруза.Форма.ФормаСписка.Форма(27,22)}: Переменная не определена (НужнаяДатаВремя)
        ДельтаОтНачалаДня = <<?>>НужнаяДатаВремя - Дата (1,1,1); (Проверка: Сервер)
    {ЖурналДокументов.ПоступлениеГруза.Форма.ФормаСписка.Форма(30,3)}: Переменная не определена (Объект)
            <<?>>Объект.Дата = НачалоДня(ОбъектДок.Дата)+ДельтаОтНачалаДня; (Проверка: Сервер)
    {ЖурналДокументов.ПоступлениеГруза.Форма.ФормаСписка.Форма(18,2)}: Процедура или функция с указанным именем не определена (УстановитьДатыВремяДляДок)
        <<?>>УстановитьДатыВремяДляДок(Элементы.Список.ВыделенныеСтроки,ДатаДляУст); (Проверка: Тонкий клиент)
    

  6. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    А причем тут тогда форма журнала документов ????

    — Объединение сообщений, 27 авг 2014

    Не следует вам трогать конфу, создайте обработку.

  7. объясните пожалуйста подробнее!…


  8. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

  9. Да!
    Большое Спасибо Вам!
    код

    &НаКлиенте
    Процедура УстановитьДатуДляВыделеных(Команда)
        // Спросим дату и время у пользователя
        //ДатаНапоминания = РабочаяДата;
        Если не ЗначениеЗаполнено(ДатаДляУст)Тогда
            Подсказка = "Введите дату и время";
            ЧастьДаты = ЧастиДаты.ДатаВремя;
            Если ВвестиДату(ДатаДляУст, Подсказка, ЧастьДаты) Тогда
                Элементы.ДатаДляУст.Видимость = Истина;
            КонецЕсли;
        КонецЕсли;
       
        // определение выделенных документ
        //Элементы.Список.ВыделенныеСтроки
       
        //установка для выделенных док дату и времени
        УстановитьДатуДляДок(Элементы.Список.ВыделенныеСтроки,ДатаДляУст);
        Элементы.Список.Обновить();
       
    КонецПроцедуры
    
    
    &НаСервере
    Процедура УстановитьДатуДляДок(Знач МассивДок, НужнаяДата) 
       
        ДельтаОтНачалаДня = НужнаяДата - Дата (1,1,1);
        Для каждого СсылкаНаДок Из МассивДок Цикл
            //ОбъектДок = СсылкаНаДок.ПолучитьОбъект();
            //ОбъектДок.Дата = НачалоДня(ОбъектДок.Дата)+ДельтаОтНачалаДня;
            //ОбъектДок.Записать();
            ОбъектДок = СсылкаНаДок.ПолучитьОбъект();
            ОбъектДок.Дата = НужнаяДата;
            Попытка
                ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;                         
        КонецЦикла;
       
       
    КонецПроцедуры
    


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить дату договора дополнительным соглашением
  • Как изменить дату дня рождения вконтакте
  • Как изменить дату дня рождения вайбер
  • Как изменить дату дмб таймер призыва
  • Как изменить дату выплаты пенсии на карту сбербанка

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии