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

  • АКТУАЛЬНЫЕ РЕЛИЗЫ 1С
  • ПРИМЕРЫ КОДА НА ПЛАТФОРМЕ 1С
Документы в 1С 8.x
  • Как создать новый документ?
  • Как найти документ?
  • Как открыть форму документа?
  • Как изменить значение реквизита и записать документ?
  • Как добавить строку в табличную часть документа, имея ссылку на документ?
  • Как удалить строки из табличной части документа?
  • Как перебрать строки документа?
  • Как выгрузить табличную часть документа?
  • Как посчитать итог в табличной части документа?
  • Как провести документ?
  • Как перебрать документы?
  • Как пометить на удаление все приходные накладные?
  • Как, имея ссылку на документ, создать в базе его копию?
  • Как, имея ссылку на документ, прочитать его движения по регистру?
  • Как определить, по каким регистрам документ выполнил движения?
  • Как в табличной части документа удалить строки с нулевым значением реквизита «Количество»?
  • Как очистить колонку «СтавкаНДС» в табличном поле «Товары» уже заполненного документа?
  • Как заполнить значения свойств нового документа на основании существующего?
  • Как получить перечень приходных накладных, в которых не заполнены номенклатурные позиции?
  • Как на дату расходной накладной определить курс валюты управленческого учета? Валюта управленческого учета храниться в периодическом регистре сведений.
  • Как из формы документа вызвать его неоперативное проведение?
  • Как в обработке проведения получить остатки, актуальные на позицию документа?
  • Как определить количество документов и количество разных значений реквизита в таблице записей документа?
  • В последовательность «ПартионныйУчет» добавлено измерение «Организация». Как теперь получить данные по границам последовательности для каждого значения этого измерения?
  • Как быстро получить информацию, по всем объектам, находящимся в компетенции конкретного менеджера (элемент справочника «Пользователи») по продажам?

Как создать новый документ?

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

ИскомыйДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(НомерДок, Дата(2005, 1, 1)); 
Если НЕ ИскомыйДокумент.Пустая() Тогда 
	// Выполнить действия в случае обнаружения такого документа. … 
КонецЕсли;          
Как открыть форму документа?

Форма = ИскомыйДокумент.ПолучитьФорму(); 
Форма.Открыть();          
Как изменить значение реквизита и записать документ?

ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект(); 
ДокОбъект.Ответственный = глТекущийПользователь; 
ДокОбъект.Записать(); 

// Запись с проведением документа
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение); 

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

ОбъектДок = Док.ПолучитьОбъект(); 
НоваяСтрока = ОбъектДок.Товары.Добавить(); 

// Заполнить значения реквизитов. 
НоваяСтрока.Количество = 10; 
НоваяСтрока.Цена = 55;  

// Записать документ. 
ОбъектДок.Записать();          
Как удалить строки из табличной части документа?

ОбъектДокумента = Документ.ПолучитьОбъект(); 
ОбъектДокумента.Товары.Очистить();          
Как перебрать строки документа?

Для Каждого ТекущаяСтрока Из Документ.Товары Цикл 
	// Действия со строкой табличной части. 
КонецЦикла; 


СтаршийИндекс = Документ.Товары.Количество() - 1; 
Для Сч = 0 по СтаршийИндекс Цикл 
	// Действия со строкой табличной части.
КонецЦикла;          
Как выгрузить табличную часть документа?

ТаблицаТоваровДокумента = Документ.Товары.Выгрузить();          
Как посчитать итог в табличной части документа?

ВсегоПоКолонкеСумма = Документ.Товары.Итог("Сумма");         
Как провести документ?

НужныйДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);          
Как перебрать документы?

ВыборкаДокументов = Документы.Расходная.Выбрать(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата())); 
Пока ВыборкаДокументов.Следующий() Цикл 
	// Действия с документом - элементом выборки, 
	// его значение содержится в переменной ВыборкаДокументов 
КонецЦикла 


Запрос = Новый Запрос; 
Запрос.Текст = " 
	|ВЫБРАТЬ 
	|	РеализацияТоваровУслуг.Ссылка 
	|ИЗ 
	|	Документ. РеализацияТоваровУслуг КАК РеализацияТоваровУслуг 
	|ГДЕ 
	|	РеализацияТоваровУслуг.Контрагент = &Контрагент 
	|	И 
	|	(РеализацияТоваровУслуг.Номер < 100 | ИЛИ | РеализацияТоваровУслуг.Дата < ДАТАВРЕМЯ(2005, 1, 1)) 
	|	И 
	|	РеализацияТоваровУслуг.Товары.Номенклатура В ИЕРАРХИИ(&Номенклатура)"; 

Запрос.УстановитьПараметр("Контрагент", ОтбКонтрагент); 
Запрос.УстановитьПараметр("Номенклатура", ОтбНоменклатура); 

Результат = Запрос.Выполнить(); 
Выборка = Результат.Выбрать(); 
Пока Выборка.Следующий() Цикл 
	// действия с документом - элементом выборки, 
	// его значение содержится в переменной Выборка 
КонецЦикла;         
Как пометить на удаление все приходные накладные?

ДокументыВида = Документы.ПоступлениеТоваровУслуг.Выбрать(); 
Пока ДокументыВида.Следующий() Цикл 
	ДокОбъект = ДокументыВида.ПолучитьОбъект(); 
	ДокОбъект.УстановитьПометкуУдаления(Истина); 
КонецЦикла;          
Как, имея ссылку на документ, создать в базе его копию?

ДокументКопия = ИсходныйДокумент.Скопировать(); 
ДокументКопия.Дата = РабочаяДата; 
ДокументКопия.Записать(); 

ДокументКопия.Дата = ИсходныйДокумент.Дата;          
Как, имея ссылку на документ, прочитать его движения по регистру?

Запрос = Новый Запрос; 
Запрос.Текст ="ВЫБРАТЬ * 
	|ИЗ 
	|	РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткиНоменклатуры 
	|ГДЕ 
	|	ОстаткиНоменклатуры.Регистратор = &Регистратор"; 

Запрос.УстановитьПараметр("Регистратор", ПолеВводаРегистратор); 

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


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

ВЫБРАТЬ ПЕРВЫЕ 1 
	"Внутренние заказы" КАК Регистр 
ИЗ 
	РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы 
ГДЕ 
	ВнутренниеЗаказы.Регистратор = &Регистратор 

ОБЪЕДИНИТЬ 

ВЫБРАТЬ ПЕРВЫЕ 1 
	"Заказы поставщикам" КАК Регистр 
ИЗ 
	РегистрНакопления.ЗаказыПоставщикам КАК ЗаказыПоставщикам 
ГДЕ 
	ЗаказыПоставщикам.Регистратор = &Регистратор 

ОБЪЕДИНИТЬ 

ВЫБРАТЬ ПЕРВЫЕ 1 
	"Размещение заказов покупателей" КАК Регистр 
ИЗ 
	РегистрНакопления.РазмещениеЗаказовПокупателей КАК РазмещениеЗаказовПокупателей 
ГДЕ 
	РазмещениеЗаказовПокупателей.Регистратор = &Регистратор 

ОБЪЕДИНИТЬ 

ВЫБРАТЬ ПЕРВЫЕ 1 
	"Товары в резерве на складах" КАК Регистр 
ИЗ 
	РегистрНакопления.ТоварыВРезервеНаСкладах КАК ТоварыВРезервеНаСкладах 
ГДЕ 
	ТоварыВРезервеНаСкладах.Регистратор = &Регистратор          
Как в табличной части документа удалить строки с нулевым значением реквизита «Количество»?

ОбъектДок = СсылкаДок.ПолучитьОбъект(); 
СтруктураДляПоиска = Новый Структура("Количество", 0); 

ТабличнаяЧастьДок = ОбъектДок.Товары; 
МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска); 

Для каждого Строка Из МассивПустыхСтрок Цикл 
	ТабличнаяЧастьДок.Удалить(Строка); 
КонецЦикла; 

ОбъектДок.Записать(); 

СтруктураДляПоиска = Новый Структура("Количество", 0); 

МассивПустыхСтрок = Товары.НайтиСтроки(СтруктураДляПоиска); 

Для каждого Строка Из МассивПустыхСтрок Цикл 
	Товары.Удалить(Строка); 
КонецЦикла;          
Как очистить колонку «СтавкаНДС» в табличном поле «Товары» уже заполненного документа?

Процедура ТоварыСтавкаНДСПриИзменении(Элемент) 

	// Рассчитать реквизиты табличной части. 
	РассчитатьСуммуНДСТабЧасти(ЭлементыФормы.Товары.ТекущиеДанные, ЭтотОбъект); 

КонецПроцедуры // ТоварыСтавкаНДСПриИзменении() 


Для Каждого Строка из Товары Цикл 
	Строка.СтавкаНДС = Неопределено; 
	// Передать управление на процедуру, вызываемую 
	// из обработчика события "ПриИзменении" для поля ввода "СтавкаНДС" 
	ЭлементыФормы.Товары.ТекущаяСтрока = Строка; 
	РассчитатьСуммуНДСТабЧасти(ЭлементыФормы.Товары.ТекущиеДанные, ЭтотОбъект); 
КонецЦикла;          
Как заполнить значения свойств нового документа на основании существующего?

НовыйСчет = Документы.СчетНаОплатуПокупателю.СоздатьДокумент(); 
ЗаполнитьЗначенияСвойств(НовыйСчет, ДокументЗаказа, , "Дата"); 

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

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

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

НовыйСчет.ЗаказПокупателя = ДокументЗаказа; 

Форма = НовыйСчет.ПолучитьФорму(); 
Форма.Открыть();          
Как получить перечень приходных накладных, в которых не заполнены номенклатурные позиции?

Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ 
	|	ПриходнаяТовары.Ссылка как Накладные 
	|ИЗ 
	|	Документ.ПоступлениеТоваровУслуг.Товары КАК ПриходнаяТовары 
	|ГДЕ 
	|	ПриходнаяТовары.Номенклатура = &ПустаяНоменклатура"; 

Запрос.УстановитьПараметр("ПустаяНоменклатура", Справочники.Номенклатура.ПустаяСсылка()); 

ТаблицаНакладных = Запрос.Выполнить();          
Как на дату расходной накладной определить курс валюты управленческого учета? Валюта управленческого учета храниться в периодическом регистре сведений.

ВЫБРАТЬ 
	КурсыВалютСрезПоследних.Валюта КАК ВалютаУпр, 
	КурсыВалютСрезПоследних.Курс КАК КурсУпр 
ИЗ 
	РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента, Валюта В 
(ВЫБРАТЬ 
	УчетнаяПолитикаСрезПоследних.ВалютаУправленческая 
ИЗ 
	РегистрСведений.УчетнаяПолитика.СрезПоследних(&ДатаДокумента, ) 
	КАК УчетнаяПолитикаСрезПоследних ) 
) КАК КурсыВалютСрезПоследних          
Как из формы документа вызвать его неоперативное проведение?

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

Запрос.Текст = " ВЫБРАТЬ 
	|	ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток, 
	|	ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток 
	|ИЗ 
	|	РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ПараметрПериод, 
	|								ДоговорКонтрагента = &Договор 
	|								И 
	|								Сделка =&Сделка) КАК ВзаиморасчетыСКонтрагентамиОстатки"; 

Запрос.УстановитьПараметр("ПараметрПериод", МоментВремени());           
Как определить количество документов и количество разных значений реквизита в таблице записей документа?

ВЫБРАТЬ 
	КОЛИЧЕСТВО(РегистрацияПростоевВОрганизации.Ссылка) КАК Случаев, 
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегистрацияПростоевВОрганизации.ФизЛицо) КАК Работников 
ИЗ 
	Документ.РегистрацияПростоевВОрганизации КАК РегистрацияПростоевВОрганизации 
ГДЕ 
	РегистрацияПростоевВОрганизации.Проведен           
В последовательность «ПартионныйУчет» добавлено измерение «Организация». Как теперь получить данные по границам последовательности для каждого значения этого измерения?

ТаблицаГраниц = Последовательности.ПартионныйУчет.ПолучитьГраницы("Организация"); 
Для Каждого СтрокаТаблицыГраниц Из ТаблицаГраниц Цикл 
	Организация = СтрокаТаблицыГраниц.Организация; 
	ДатаГП = СтрокаТаблицыГраниц.Граница.Дата; 
	СсылкаГП = СтрокаТаблицыГраниц.Граница.Ссылка; 
КонецЦикла;          
Как быстро получить информацию, по всем объектам, находящимся в компетенции конкретного менеджера (элемент справочника «Пользователи») по продажам?

МассивСсылок = КритерииОтбора.КомпетенцияМенеджераПродаж.Найти(Менеджер); 
Для Каждого Ссылка из МассивСсылок Цикл 
	Сообщить(Ссылка); 
КонецЦикла; 

ВЫБРАТЬ 
	КомпетенцияМенеджераПродаж.Ссылка 
ИЗ 
	КритерийОтбора.КомпетенцияМенеджераПродаж(&Менеджер) КАК КомпетенцияМенеджераПродаж          

Задайте вопрос программисту 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

Как передать значение реквизита справочника в реквизит формы документа

Я
   rulikch

16.04.09 — 18:20

Подскажите, пожалуйста, как передать значение реквизита формы списка справочника в реквизит формы документа.

  

Партнерская программа EFSOL Oblako

   ТелепатБот

1 — 16.04.09 — 18:20

   also

2 — 16.04.09 — 18:22

Обясни что ты конкретно хочешь сделать

   Cthulhu

3 — 16.04.09 — 18:43

Если по педальке на реквизите формы дока открываешь справочник — то «ОбработкаВыбораЗначения»
Если из справочника открываешь форму документа — то присваиванием через контекст сразу после «ОткрытьФорму»

   ZDenis

4 — 16.04.09 — 19:30

(0)  связь между справочником и документом какая?

РеквизитДокумента = ВыбСправочник.РеквизитСправочника, типы естественно должны совпадать

   rulikch

5 — 17.04.09 — 23:08

Я в обработке в тестовые поля ввожу данные: ФИО, адрес, телефон и т.д. после нажатия кнопки в обработке данные добавляются в справочник «Клиенты». А затем после нажатия на определенном этапе обработки другой кнопки данные передаются в документ «Договор» форма, которого открывается с уже заполненными реквизитами шапки. Строковые реквизиты передаются понятно как, а вот как в реквизит формы документа «Договор» передать значение ранее добавленного в справочник «Клиенты» элемента не понятно. Подскажите, пожалуйста.

   Cthulhu

6 — 17.04.09 — 23:11

Запомни при сохранении (когда «данные добавляются в справочник «Клиенты»») — и установи через контекст документа после ОткрытьФорму

   rulikch

7 — 17.04.09 — 23:47

Док = СоздатьОбъект(«Документ.Договор»);

   Док.Новый();

   
   Док.Клиент = ФИО;

   //ФИО — реквизит обработки в который вносится значение и передается в справочник «Клиенты», а как из справочника «Клиенты» этот реквизит в документ передать.

   
   Док.Записать();    

   Докум = Док.ТекущийДокумент();

   ОткрытьФорму(Докум);

   Cthulhu

8 — 17.04.09 — 23:58

тКонт=»»;
ОткрытьФорму(Докум,тКонт);
тКонт.<ИмяРеквизитаДокумента>=<ТоШоНадо>;

   rulikch

9 — 18.04.09 — 01:28

Не получается !

   rulikch

10 — 18.04.09 — 09:30

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

Док = СоздатьОбъект(«Документ.Договор»);

Спр = СоздатьОбъект(«Справочник.Клиенты»);

   Док.Новый();

   Док.Записать();

   Докум = Док.ТекущийДокумент();

   Док.Клиент = Спр.Наименование ;

       Док.ТелефонКлиента = Телефоны_анкета; //вот строка передается просто; Телефоны_анкета — поле для ввода в обработке; Есть такое же поле ФИО для ввода Ф.И.О. клиента, значение которого заносится в Наименование справочника «Клиенты».

   ОткрытьФорму(Докум, Док.Клиент);

Подскамжите, пожалуйста, как правильно передать именно текущий реквизит?

   dk

11 — 18.04.09 — 09:40

(10) тебе все в (8) уже рассказали

   dk

12 — 18.04.09 — 09:48

для особо крепкоклювых:

Конт = 0;

ОткрытьФорму(«Документ.Договор», Конт);

Конт.Клиент = ВыбКлиент; // <— ВыбКлиент — это нифига не строка!!!!!

Конт.Форма.Обновить();



Или у тебя трудности с нахождением ВыбКлиент?

   Cthulhu

13 — 18.04.09 — 11:32

(12): у него похоже трудности с… короче праситя люди, галодный быль…
ЗЫ: блин, ну почему все мои жертвы так упорно орут «помогитеничевонипанимайу».. ну не понял — сидиш читаеш по слогам и малчиш фтряпачку…

   rulikch

14 — 20.04.09 — 18:49

В данном случае как лучше найти тот эелемент, который ввели в обработке и поместили программно в документ?

   Botanik8888

15 — 20.04.09 — 18:56

фигасе стаж 4 года

   rulikch

16 — 20.04.09 — 20:06

Я не могу понять по какому принципу искать. Ввел в текстовой поле в форме обработки Ф.И.О. потом программно загоняю его в справочник:

Спр=СоздатьОбъект(«Справочник.Клиенты»);

   Спр.Новый();  

   Спр.Наименование=ФИО;

   Спр.КодКарточки=КодКарточки;

Спр.Записать();

После этого дохожу в обработке до этапа когда необходимо передать все данные в документ и сдесь в поле Клиент — типа справочник «Клиент», должен уже находиться тот клиент которого мы ранее занесли в справочник. Пользователь нажимает на кнопку возле реквизита и открывается справочник «Клиенты» с подсвеченным выбранным клиентом.

Вот здесь и проблема с поиском введенного и передачей в ОткрытьФорму()…

   ZDenis

17 — 20.04.09 — 20:10

(16) А что ты в открывающуюся форму списка справочника «Клиенты» при этом передать хочешь?

   Cthulhu

18 — 20.04.09 — 20:13

   ZDenis

19 — 20.04.09 — 20:21

(16) По порядку что я понял из сказанного:

1. Обработкой создается элемент справочника «Клиенты».

2. В отрувающуюся форму документа он передается в реквизит.

3. Некто открывает справочник «коиенты» (непонятно засем, ведь реквизит уже заполнен).

4. Необходимо в открытом списке еще что-то найти.

Так?

   ZDenis

20 — 20.04.09 — 20:23

(19) Извините за синтаксические ошибки, корпоратив на работе.

   rulikch

21 — 20.04.09 — 20:43

(19) До 3-го пункта все правильно. Потом Нажимается кнопка в обработке и открывается форма документа с уже заполненными реквизитами. А в реквизите «Клиент» установлен созданный только, что программно клиент. А педалька возле него лишь для того, чтобы пользователь в заполненном документе мог открыть клиента и может из справочника какую-то информацию или посмотреть или подправить.

У меня большинство реквизитов документа типа «Строка» и передается все просто:

Док.ТелефонКлиента = Телефоны_анкета;

А как передать реквизит типа «Справочник».

Спр=СоздатьОбъект(«Справочник.Клиенты»);

Спр.Новый();  

Спр.Наименование=ФИО;

Спр.КодКарточки=КодКарточки;

Спр.Записать();

ВыбКлиент = Спр.ТекущийЭлемент();

Конт = 0;

ОткрытьФорму(«Документ.Договор», Конт);

Конт.Клиент = ВыбКлиент;

Конт.Форма.Обновить();

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. Исходные данные для построения маршрута:
* Географические координаты объектов, которые хранятся в базе;
* Координаты начальной и коне


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

Тема: Получение значения реквизита элемента из справочника в документ

  1. 17.05.2019, 09:54


    #1

    MasterLoma вне форума


    Гость форума


    Question Получение значения реквизита элемента из справочника в документ

    Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
    В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.


  2. 17.05.2019, 10:38


    #2

    Margofs вне форума


    Пришел за помощью


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    Какая конфигурация? на какой платформе?


  3. 17.05.2019, 10:54


    #3

    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

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

    Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
    В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.

    Цена — это реквизит справочника «Номенклатура»?
    Тогда можно обращаться без функции: Цена=Номенклатура.Цена;
    Это должно быть прописано в процедуре «ПриВыбореНоменклатуры», которая назначается колонке «Номенклатура»вашей табличной части


  4. 17.05.2019, 11:07


    #4

    Margofs вне форума


    Пришел за помощью


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    на клиенте он заполняет табличную часть….. не обратиться он объектно!


  5. 17.05.2019, 11:10


    #5

    Margofs вне форума


    Пришел за помощью


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции


  6. Пользователь сказал cпасибо:


  7. 17.05.2019, 11:20


    #6

    Margofs вне форума


    Пришел за помощью


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

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

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    часть


  8. 17.05.2019, 12:23


    #7

    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

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

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    Можно так:
    &НаКлиенте
    Процедура ТабличнаяЧасть1Номенклату� �аПриИзменении(Элемент)
    ТекущиеДанные = Элементы.ТабличнаяЧасть1.Т� �кущиеДанные;
    УИ=ТекущиеДанные.Номенклат ура.УникальныйИдентификат� �р();
    ТекущиеДанные.Цена=НайтиЦе ну(УИ);
    КонецПроцедуры
    &Насервере
    Функция НайтиЦену(Реквизит)
    ТекН=Справочники.Номенклат ура.ПолучитьСсылку(Реквизи т);
    Возврат ТекН.Цена;

    КонецФункции


  9. Пользователь сказал cпасибо:


  10. 17.05.2019, 14:03


    #8

    MasterLoma вне форума


    Гость форума


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

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

    Какая конфигурация? на какой платформе?

    1С:Предприятие 8.3, учебная версия (8.3.6.2014)


  11. 17.05.2019, 14:04


    #9

    MasterLoma вне форума


    Гость форума


    По умолчанию Re: Получение значения реквизита элемента из справочника в документ

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

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    Спасибо попозже попробую таким образом сделать.


Похожие темы

  1. Ответов: 16

    Последнее сообщение: 24.03.2017, 10:41

  2. Ответов: 0

    Последнее сообщение: 14.01.2014, 12:53

  3. Ответов: 1

    Последнее сообщение: 24.04.2012, 13:36

  4. Ответов: 0

    Последнее сообщение: 28.01.2012, 12:20

  5. Ответов: 4

    Последнее сообщение: 11.11.2011, 08:35

Социальные закладки

Социальные закладки


Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
  • BB коды Вкл.
  • Смайлы Вкл.
  • [IMG] код Вкл.
  • [VIDEO] код Вкл.
  • HTML код Выкл.

Правила форума

0 / 0 / 0

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

Сообщений: 3

1

1C 8.x (тонкий)

Получение значения реквизита справочника в документ

29.05.2014, 12:17. Показов 64944. Ответов 22


Добрый день, есть вопрос
Как сделать чтобы реквизит табличной части документа получал данные из реквизита справочника.
Т.е. при изменении «ФИО» в табличной части документа подставлялись значения (ДатаРождения, Должность)из справочника (Сотрудники)

Есть справочник Сотрудники, реквизиты «Должность», «Дата рождения»

Есть документ в нем табличная часть «Налоги» и его реквизиты «ФИО» «Должность» «ДатаРождения»

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

Прошу в поиск не посылать, т.к. пробывал уже много вариантов в т.ч. программно через функции

платформа 8.2



0



GreenkA

Эксперт 1С

3051 / 1998 / 524

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

Сообщений: 6,964

29.05.2014, 12:34

2

Mujinin, пропишите заполнение этих полей при изменении ФИО. Какая форма? Если управляемая, то значения получать придется на клиенте. Иначе — можно все в одной процедуре.
Пример для управляемой:

1C
1
2
3
4
5
6
7
8
9
10
11
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
  ТекСтрока = Элементы.Налоги.ТекущиеДанные;
  ТекСтрока.ДатаРождения = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"ДатаРождения");
  ТекСтрока.Должность = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"Должность");
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьЗначениеРеквизитаНаСервере(ИмяОбъекта, ИмяРеквизита)
  Возврат ИмяОбъекта[ИмяРеквизита];
КонецФункции



2



Mujinin

0 / 0 / 0

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

Сообщений: 3

29.05.2014, 12:41

 [ТС]

3

о мой спаситель….почему мне раньше этого никто не мог подсказать….я начал пол года назад и все время обходил это автозаполнение.

делал все тоже самое только «ФИО» в

1C
1
ТекСтрока.Должность = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"Должность");

не выставлял



0



Anmut

0 / 0 / 0

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

Сообщений: 12

27.08.2015, 09:09

4

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

1C
1
2
3
4
5
6
7
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
    \ Что тут надо прописать?
  Объект.Подразделение = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"Подразделение");
  Объект.Должность = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"Должность");
    
КонецПроцедуры



0



SonicQ

286 / 186 / 18

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

Сообщений: 925

27.08.2015, 10:12

5

Anmut, я бы лучше изменял реквизиты объекта на сервере. Думаю так будет правильнее

1C
1
2
3
4
5
6
7
8
9
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
   ФИОПриИзмененииНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ФИОПриИзмененииНаСервере()
    Объект.Должность = ТутЧтоХотитеПолучайте_ЭтоСервер;
КонецПроцедуры



1



340 / 315 / 43

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

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

Записей в блоге: 1

27.08.2015, 15:06

6

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

Думаю так будет правильнее

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

Лучше серверный вызов делать в один раз, получать маленькие данные и заполнить на клиенте. Т.к. объет на форме уже заблокирован вами.



0



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:28

7

1c-k,
чтобы потом получить надпись вида «Данный элемент заблокирован пользователем»
после чего данные не получить и форма просто висит



0



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:41

8

1c-k, бесспорно, вариант с объект.Реквизит = на клиенте быстрее….
Но зачастую нужно не просто изменить один объект…

Миниатюры

Получение значения реквизита справочника в документ
 



1



1c-k

340 / 315 / 43

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

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

Записей в блоге: 1

27.08.2015, 17:43

9

SonicQ, это с чего такие выводы?
Например на сервер ссылка слетала и оттуда ссылка пришла — 50байт.
А если перекидку на сервер, сколько слетало данных?

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
    Объект.Должность = ФИОПриИзмененииНаСервере(Объект.Ссылка);
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ФИОПриИзмененииНаСервере(ОбъектСсылка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Должности.Ссылка
        |ИЗ
        |   Справочник.Должности КАК Должности
        |ГДЕ
        |   Должности.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", ОбъектСсылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда 
        Возврат Справочники.Должности.ПустаяСсылка();
    КонецЕсли
    
    РезультатЗапроса = РезультатЗапроса.Выбрать();
    
    РезультатЗапроса.Следующий();
    
    Возврат Результат.Ссылка;
КонецФункции

Добавлено через 1 минуту

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

Но зачастую нужно не просто изменить один объект…

за код ниже от меня программеры получают нагоняй.



1



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:45

10

1c-k, а клиент при этом плачет, что при заполнении одного реквизита все остальные не заполнились автоматом…



1



340 / 315 / 43

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

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

Записей в блоге: 1

27.08.2015, 17:47

11

SonicQ, ахахаха. Срочно учить матчасть вызовов в управляемом приложении и что и как там происходит с контекстами.

Добавлено через 1 минуту
SonicQ, ах да, в фрагменте кода на картинке там два раза дёргается сервер, вероятно туда обрабно большие объемы данных гонять это нормально.
А соединить в один серверный вызов никак нельзя?)



1



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:48

12

1c-k, я специально для примера так сделал



1



340 / 315 / 43

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

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

Записей в блоге: 1

27.08.2015, 17:50

13

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



1



SonicQ

286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:58

14

1c-k, однако именно

1C
1
2
3
4
5
6
7
8
9
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
   ФИОПриИзмененииНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ФИОПриИзмененииНаСервере()
    Объект.Должность = ТутЧтоХотитеПолучайте_ЭтоСервер;
КонецПроцедуры

реализовано в типовых конфигурациях, только там продолжения типа

1C
1
ПродажиСервер.ЗаполнитьБанковскиеСчетаПоДоговору(Объект.Договор, Объект.БанковскийСчетОрганизации, Объект.БанковскийСчетКонтрагента);



1



340 / 315 / 43

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

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

Записей в блоге: 1

27.08.2015, 18:05

15

SonicQ, однако надо давать себе отчёт, почему и что в типовых конфигурациях сделано.
Партионный учёт УТ 10.3 например глючит и тормозит, а ведь изменения, которые надо сделать в двух местах — нагрузку снимает со всего сервера. Так что же, надо делать, как в типовой?

Добавлено через 45 секунд
SonicQ, а то что сделано в типовых, это проблемы типовых.
И к сожалению эти проблемы из-за вот таких вещей, становятся проблемами владельцев при больших объемах БД.



1



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 18:09

16

1c-k, палка двух концов =)



1



340 / 315 / 43

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

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

Записей в блоге: 1

27.08.2015, 18:19

17

SonicQ, нет. Тут надо подходить из разумности вызовов, дёрганья сервера, и т.п.
В данном случае всё банально и просто, как я выше писал и не надо гонять форму на сервер.
А есть случаи когда для расчетов уходит только таблица и возвращается только таблица. Был у меня документ, который именно так и работает. Потому как программеры писали &НаСервере всегда и везде не думая, что в итоге будет. А в документе 12+ табличных частей и около 6 из них под 100к записей имели да еще по 10-12 колонок.
Так, что к решаемой задаче надо подходить зная, как ведет себя платформа в разных контекстах и что происходит с этим.



1



0 / 0 / 0

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

Сообщений: 12

28.08.2015, 11:32

18

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



0



1c-k

340 / 315 / 43

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

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

Записей в блоге: 1

28.08.2015, 11:34

19

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

Подскажите, пожалуйста, так правильно будет?

1C
1
2
3
4
5
6
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
  Объект.Должность = ПолучитьЗначениеРеквизитаНаСервере(Объект.ФИО,"Должность");
  Объект.Подразделение = ПолучитьЗначениеРеквизитаНаСервере(Объект.ФИО,"Подразделение");
  ОбновитьОтображениеДанных();
КонецПроцедуры

Это как вариант. Увидел бы написал как надо.



1



Anmut

0 / 0 / 0

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

Сообщений: 12

28.08.2015, 11:44

20

Спасибо огромное!!! сделал!!!

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
&НаСервереБезКонтекста
Функция ПолучитьЗначениеРеквизитаНаСервере(ИмяОбъекта, ИмяРеквизита)
  Возврат ИмяОбъекта[ИмяРеквизита];
КонецФункции
 
&НаКлиенте
Процедура МатериалыМатериалПриИзменении(Элемент)
    СтрокаТабличнойЧасти=Элементы.Материалы.ТекущиеДанные;
    СтрокаТабличнойЧасти.ЕдиницыИзмерения=ПолучитьЗначениеРеквизитаНаСервере(СтрокаТабличнойЧасти.Материал,"ЕдиницыИзмерения");
КонецПроцедуры
 
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
    Объект.Должность = ПолучитьЗначениеРеквизитаНаСервере(Объект.ФИО,"Должность");
Объект.Подразделение = ПолучитьЗначениеРеквизитаНаСервере(Объект.ФИО,"Подразделение");
КонецПроцедуры

Добавлено через 2 минуты
Не подскажешь? Сделал конструктором печати форму, все нормально работало. Сейчас решил переделать, кнопка в форме стоит в конфе, а запускаю 1с ее нет в доке..



0



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

Понравилась статья? Поделить с друзьями:
  • Как открыть бизнес по продаже ювелирных изделий
  • Как изменить банковские реквизиты на ртс тендер
  • Как открыть горнолыжный комплекс бизнес проекты
  • Как изменить пароль в альфа банке бизнес онлайн
  • Как открыть компанию на кипре гражданину россии