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

17 правил для составления оптимального ЗАПРОСа к данным базы 1С 47
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ


1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш


1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей.


Google maps : вывод точек на карту и режим панорамы 8
В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора


Google maps, поиск оптимального маршрута 5
В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута:
* Географические координаты объектов, которые хранятся в базе;
* Координаты начальной и коне


Посмотреть все результаты поиска похожих

Программно изменить реквизит документа

Автор Ruslan09609, 03 дек 2018, 09:31

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

Добрый день! Я с помощью запроса получил все  документы ОПЗС теперь мне надо в документе ОПЗС табличной части продукция перевыбрать строку номенклатура и провести документ,помогите пожалуйста совсем зеленому программисту.
Какой код должен быть в цикле ?Заранее благодарю за то что вникаете в мою проблему.
      Запрос = Новый Запрос;
   Запрос.Текст =
      «ВЫБРАТЬ
      |   ОтчетПроизводстваЗаСмену.Ссылка,
      |   ОтчетПроизводстваЗаСмену.Дата,
      |   ОтчетПроизводстваЗаСмену.Продукция.(
      |      Номенклатура
      |   )
      |ИЗ
      |   Документ.ОтчетПроизводстваЗаСмену КАК ОтчетПроизводстваЗаСмену»;

   Результат = Запрос.Выполнить();

   ВыборкаДетальныеЗаписи = Результат.Выбрать();

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
   ОтчетПроизводстваЗаСмену.Записать(РежимЗаписиДокумента.Запись);//не знаю какой код должен быть       
   КонецЦикла;


Конечная цель какая? «Перевыбрать» — это чтобы выполнились действия при выборе номенклатуры в интерактивном режиме?


Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ОтчетПроизводстваЗаСмену = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
СтрокаПоиска = ОтчетПроизводстваЗаСмену.Материалы.Найти(НоменклатураДляЗамены, "Номенклатура");
Если СтрокаПоиска <> Неопределено Тогда
СтрокаПоиска.Номенклатура = ЗаменяемаяНоменклатура;
ОтчетПроизводстваЗаСмену.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;     
КонецЦикла;


Ну, вообще то задача самая тривиальная, какая только может быть. Запрос у вас неправильно написан, с избыточной выборкой информации. В нём сейчас выбираются ссылки на все документы + дата каждого документа + для каждого документа, зачем-то, колонка «номенклатура» из табличной части «продукция». Дата, допустим, нужна для упорядочивания, чтоб проводить документы в хронологическом порядке. Но для этого нужно в запросе дописать

"УПОРЯДОЧИТЬ ПО ОтчетПроизводстваЗаСмену.Дата"

Поле «номенклатура» же в запросе Вам не нужно совершенно. Вы будете в цикле получать по каждой ссылке документ-объект. Объект считывается из БД целиком, включая все реквизиты и табличные части.

В общем случае как-то так нужно написать

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ДокументОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); // тут вы получаете объект
Для каждого Стр из ДокументОбъект.Продукция Цикл
    Стр.Номенклатура = Номенклатура //ссылка на вашу номенклатуру. Если нужно менять не на одну и ту же, а по какому-то условию, то пишете ваше условие
КонецЦикла;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); //Вам же провести нужно? Вот и пишите "проведение", а не "запись".

       КонецЦикла;


Теги:

  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Программно изменить реквизит документа

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

На чтение 6 мин. Просмотров 2.6k. Опубликовано 15.12.2019

Содержание

  1. Как изменить значение реквизита документа 1С?
  2. Изменение команд формы
  3. Изменение реквизитов формы
  4. Изменение элементов формы
  5. Документы
  6. Документы в языке 1С 8.3, 8.2 (в примерах)

Как изменить значение реквизита документа 1С?

Как изменить значение реквизита документа 1С?
Часто возникает потребность изменить какое-то значение в отдельном реквизите. И не в одном документе, в в нескольких документах. Возможно использовать запрос.
Например:

В статье был рассмотрен вопрос:
Как изменить значение реквизита документа 1С?

Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

Программная модификация формы может потребоваться в нескольких случаях:

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

В управляемой форме можно программно добавить, изменить и удалить:

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды . У коллекции есть несколько методов:

Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере.

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию () . Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ;
Команда . Заголовок = «История изменений…» ;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию ( Команда )
// действия команды
КонецПроцедуры

Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте .

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты ( Путь >) , возвращающей массив типа РеквизитФормы . Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Изменение реквизитов выполняется методом ИзменитьРеквизиты ( ДобавляемыеРеквизиты >, УдаляемыеРеквизиты >) объекта УправляемаяФорма . В параметры ДобавляемыеРеквизиты и УдаляемыеРеквизиты передаются массивы с элементами типа РеквизитФормы .

Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.

Создадим новый реквизит формы с именем Покупатель:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив ;
ДобавляемыеРеквизиты . Добавить(Новый РеквизитФормы («Покупатель», Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));

// Изменения состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы . У коллекции есть несколько методов:

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить () , Добавить () , Переместить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие ( ИмяСобытия >, Действие >) .

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

// Создание команды
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ; // В форме должна быть процедура с указанным наименованием
Команда . Заголовок = «История изменений…» ;
// Создание кнопки и связь ее с командой
Элемент = Элементы . Добавить ( «ИсторияИзменений» , Тип ( «КнопкаФормы» ));
Элемент.ИмяКоманды = «ИсторияИзменений» ;

Добавление реквизита и связанного с ним поля ввода:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты . Добавить (Новый РеквизитФормы ( «Покупатель» , Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));
// Изменение состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );
// Создание поля ввода и связь с реквизитом
Элемент = Элементы . Добавить ( «Покупатель» , Тип ( «ПолеФормы» ));
Элемент . Вид = ВидПоляФормы . ПолеВвода ;
Элемент . ПутьКДанным = «Покупатель» ;

Назначение элементу формы обработчика события:

ЭлементПокупатель . УстановитьДействие ( «ПриИзменении» , «Подключаемый_ПокупательПриИзменении» );

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении ( Элемент )
// Действия события
КонецПроцедуры

Внимание!

Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие () , рекомендуется задавать префикс Подключаемый_.

Внимание!

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

Остались вопросы?
Спросите в комментариях к статье.

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

Документы

Описание:

Документ — одно из основных понятий системы 1С:Предприятие. При помощи документов организуется ввод в систему информации о совершаемых хозяйственных операциях, а также ее просмотр и корректировка.

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

Структура каждого конкретного вида документа определяется при его создании в конфигураторе. У любого вида документа существуют реквизиты, которые создаются автоматически — это «Дата» и «Номер». Номер создается, если при конфигурировании длина номера указана больше 0. Другие реквизиты документа определяются в конфигураторе отдельно для каждого создаваемого вида документа.

Документы в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

&НаСервере
Процедура Изменение_значения_реквизита_объекта(ДокСсылка, Новое_значение_реквизита)// Процедура программно меняет значение реквизита объекта (документа)
    // ДокСсылка — документ в котором необходимо изменить реквизит
    // Новое_значение_реквизита — новое значение реквизита «Реквизит_для_корректировки»

    // или так: ДокументССылка=Документы.ТТН.НайтиПоНомеру(СокрЛП(Ном),Дата(‘2021-05-16’));

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

        Попытка

ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
           
Сообщить(ОписаниеОшибки());
        КонецПопытки

    Иначе

Сообщить(Новое_значение_реквизита+» не записано в «+ДокСсылка+«! Документ не определен»);
    КонецЕсли

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

Unison1

0 / 0 / 1

Регистрация: 02.11.2016

Сообщений: 62

1

1C 8.x

Программно изменить реквизит документа внешней обработкой

10.05.2017, 11:24. Показов 36779. Ответов 13

Метки нет (Все метки)


Есть код внешней обработки, но он ничего не меняет:

1C
1
2
3
4
5
6
7
8
9
10
Процедура ЗаполнитьПолеКуратора (Кнопка)
    
    ВыборкаДокументы = Документы.Трудозатраты.Выбрать(НачалоПериода,КонецПериода);
    ДокОбъект = ВыборкаДокументы.ПолучитьОбъект();
    Пока ДокОбъект.Следующий() Цикл
        ДокОбъект.Куратор = ДокОбъект.Клиент.ОтветственныйМенеджер.Наименование;
        ДокОбъект.Записать();
    КонецЦикла
    
КонецПроцедуры

Что я делаю неправильно?



0



1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,395

10.05.2017, 11:51

2

Какой тип значения у ДокОбъект.Куратор? Скорей всего что-то типа СправочникСсылка.Сотрудники.
А ДокОбъект.Клиент.ОтветственныйМенеджер.Наименовани е — это строка.



0



OrkVasya

о_____О

Эксперт 1С

224 / 223 / 37

Регистрация: 19.11.2010

Сообщений: 1,062

10.05.2017, 12:04

3

Unison1, давно у нас ДокументОбъект превратился в выборку?

1C
1
2
3
4
5
6
7
8
9
10
Процедура ЗаполнитьПолеКуратора (Кнопка)
    
    ВыборкаДокументы = Документы.Трудозатраты.Выбрать(НачалоПериода,КонецПериода);
    Пока ВыборкаДокументы.Следующий() Цикл
        ДокОбъект = ВыборкаДокументы.ПолучитьОбъект();
        ДокОбъект.Куратор = ДокОбъект.Клиент.ОтветственныйМенеджер.Наименование;
        ДокОбъект.Записать();
    КонецЦикла
    
КонецПроцедуры



0



0 / 0 / 1

Регистрация: 02.11.2016

Сообщений: 62

10.05.2017, 12:07

 [ТС]

4

ДокОбъект.Куратор — тип СправочникСсылка.Пользователи.
ОтветственныйМенеджер.Наименование — тип СправочникСсылка.Пользователи.



0



OrkVasya

о_____О

Эксперт 1С

224 / 223 / 37

Регистрация: 19.11.2010

Сообщений: 1,062

10.05.2017, 12:09

5

Unison1, либо какая-то дикая конфа, либо не согласен.
Наименование обычно «строка».
Значит надо

1C
1
ДокОбъект.Куратор = ДокОбъект.Клиент.ОтветственныйМенеджер



0



0 / 0 / 1

Регистрация: 02.11.2016

Сообщений: 62

10.05.2017, 12:11

 [ТС]

6

OrkVasya, Всё-равно не работает)



0



polax

1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,395

10.05.2017, 12:12

7

Цитата
Сообщение от Unison1
Посмотреть сообщение

ДокОбъект.Куратор — тип СправочникСсылка.Пользователи.
ОтветственныйМенеджер.Наименование — тип СправочникСсылка.Пользователи.

Не правы. ДокОбъект.Клиент.ОтветственныйМенеджер — это СправочникСсылка.Пользователи. а с .Наименование — 100% строка
Сделайте в своем коде

1C
1
ДокОбъект.Куратор = ДокОбъект.Клиент.ОтветственныйМенеджер;

Все заработает



0



о_____О

Эксперт 1С

224 / 223 / 37

Регистрация: 19.11.2010

Сообщений: 1,062

10.05.2017, 12:13

8

Unison1, что не работает-то? В чем нерабочесть заключается?



0



Unison1

0 / 0 / 1

Регистрация: 02.11.2016

Сообщений: 62

10.05.2017, 12:17

 [ТС]

9

polax, Вы правы ОтветственныйМенеджер.Наименование — строка.
Но, даже когда я пишу в коде

1C
1
ДокОбъект.Куратор = ДокОбъект.Клиент.ОтветственныйМенеджер;

Поле Куратор всё-равно пустое. Может я документ неправильно получаю?

Добавлено через 43 секунды
OrkVasya, Поле куратора не заполняется.



0



о_____О

Эксперт 1С

224 / 223 / 37

Регистрация: 19.11.2010

Сообщений: 1,062

10.05.2017, 12:19

10

Unison1, поставь точку останова на строку «ДокОбъект.Записать()» и медетируй на реквизиты и их типы.
Посмотри, что у тебя в «ДокОбъект», что в «Куратор», что в «Ответственный менеджер», может ты пустое значение пишешь.
Мы тут отладить не сможем за тебя.



0



1808 / 1228 / 442

Регистрация: 16.01.2015

Сообщений: 5,395

10.05.2017, 12:23

11

Unison1, А что отладчик говорит для ДокОбъект.Клиент.ОтветственныйМенеджер? Похоже, значение не заполнено

Добавлено через 1 минуту
OrkVasya, ))) Не подумай что дублирую. просто опаздываю



0



0 / 0 / 1

Регистрация: 02.11.2016

Сообщений: 62

10.05.2017, 12:29

 [ТС]

12

OrkVasya, Если бы я мог отладить я бы сюда не писал.

Добавлено через 1 минуту
polax, Значения не пустые, всё заполнено.



0



о_____О

Эксперт 1С

224 / 223 / 37

Регистрация: 19.11.2010

Сообщений: 1,062

10.05.2017, 12:57

13

Unison1, мы тоже отладить не можем за тебя.
Попробуем так:
Поставь точку останова на «ДокОбъект.Записать()»
Включи отладку, после того как выполнение остановится, выдели «ДокОбъект», нажми Shift+F9, в открывшемся окошке раскрой по плюсу документ, сделай скрин и кинь сюда.

Добавлено через 2 минуты
Unison1, главное, чтобы были видны нужные поля и их типы



0



Unison1

0 / 0 / 1

Регистрация: 02.11.2016

Сообщений: 62

10.05.2017, 13:15

 [ТС]

14

Лучший ответ Сообщение было отмечено GreenkA как решение

Решение

Всё проще чем я думал)

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
&НаСервере
Процедура ЗаполнитьПолеНаСервере()
    
    ВыБоркаДокументы = Документы.ТрудозатратыКлиентов.Выбрать(НачалоПериода,КонецПериода);
    
    Пока ВыБоркаДокументы.Следующий() Цикл
        ДокОбъект = ВыБоркаДокументы.ПолучитьОбъект();
        Если НЕ ЗначениеЗаполнено(ДокОбъект.Куратор) Тогда
        ДокОбъект.Куратор = ДокОбъект.Клиент.ОтветственныйМенеджер;
        ДокОбъект.Записать();
        КонецЕсли;
    КонецЦикла;   
    
КонецПроцедуры
 
&НаКлиенте
Процедура ЗаполнитьПолеКуратора(Команда)
    ЗаполнитьПолеНаСервере();
КонецПроцедуры

Добавлено через 5 минут
Всем спасибо!



0



В этой статье научимся приемами программного создания и заполнения документов в 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

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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;
 
    // преобразуем документа обратно в данные формы
    ЗначениеВДанныеФормы(Поступление, ДанныеФормы);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Понравилась статья? Поделить с друзьями:
  • Югория страховая компания лицензия отозвана
  • 1с изменить значение реквизита в справочнике
  • Db vtb ru бизнес онлайн вход в новую систему
  • Югория страховая компания отзывы по ипотеке
  • Delko транспортная компания отзывы водителей