Имя: Пароль:
1C
1С v8
Запись в регистр без проведения документа
,
0 Dmitry017
 
25.03.13
21:22
Задача - осуществить бронирование товаров. В форме документа сделал кнопочку БронированиеТоваров и выполнил запись движений
&НаКлиенте
Процедура БронированиеТоваров(Команда)
   // Вставить содержимое обработчика.
   БронированиеТоваровНаСервере();
КонецПроцедуры


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

КонецПроцедуры // БронированиеТоваровНаСервере()


Проблема - ошибка:
{Документ.РасходнаяНакладная.Форма.ФормаДокумента.Форма(48,2)}: Недостаточно фактических параметров (Записать)
   <<?>>Записать(); (Проверка: Сервер)

Вроде бы в книжке по 1С так же написано, но у меня сейчас не работает. Что исправить?
1 ДенисЧ
 
25.03.13
21:23
регистратора не прописал
2 Адинэснег
 
25.03.13
21:24
отбор где?
3 НафНаф
 
25.03.13
21:38
у тебя случайно нет Записать собственного метода у объекта или формы?
4 Dmitry017
 
25.03.13
21:42
Нету такого собственного метода. Единственное что я заметил, все эти движения надо было описывать в модуле объекта, а я описал в модуле формы. Может быть из-за этого? Это вообще сильно важно или нет?
5 GROOVY
 
25.03.13
21:45
Записать у формы имеет параметры. СП почитай, туда структуру надо передать в ней режимзаписи=запись.
6 GROOVY
 
25.03.13
21:45
(1)(2) Он же в контексте документа, там и регистратор и отборы по дефолту выставлены.
7 НафНаф
 
25.03.13
21:46
(4) движения конечно нужно делать в объекте, ну или в менеджере
8 GROOVY
 
25.03.13
21:46
Расширение управляемой формы для документа.Записать (Managed form extension for documents.Write)
Расширение управляемой формы для документа (Managed form extension for documents)
Записать (Write)
Синтаксис:

Записать(<ПараметрыЗаписи>)
Параметры:

<ПараметрыЗаписи> (необязательный)

Тип: Структура.
Структура параметров записи, которые могут быть обработаны в обработчиках событий записи. Состав параметров произвольный. Содержит предопределенные параметры записи РежимЗаписи и РежимПроведения. Предопределенные параметры передаются в метод объекта Записать.
Параметры записи можно обработать в событиях формы ПередЗаписью, ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, ПослеЗаписи.
Возвращаемое значение:

Тип: Булево.
Истина - успешно записан; Ложь - в противном случае.
Описание:

Записывает объект.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).
9 GROOVY
 
25.03.13
21:47
(7) Это приходит с опытом. Технически писать движения можно где угодно.
10 Dmitry017
 
25.03.13
21:50
(5) По поводу параметров. Теперь всё очень внимательно переписал, на Запись() перестал ругаться.

//на форме



&НаКлиенте
Процедура БронированиеТоваров(Команда)
   // Вставить содержимое обработчика.
   ВыполнитьБронированиеНаСервере();
КонецПроцедуры

// <Описание процедуры>
//
// Параметры
//  <Параметр1>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>
//  <Параметр2>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>
//
&НаСервере
Процедура ВыполнитьБронированиеНаСервере()

       ОбъектДокумента = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.РасходнаяНакладная"));
       ОбъектДокумента.БронированиеТоваров();
       ЗначениеВДанныеФормы(ОбъектДокумента, Объект);

КонецПроцедуры // ВыполнитьБронированиеНаСервере()




//модуль объекта

Процедура ОбработкаПроведения(Отказ, Режим)
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   // регистр Количество Расход
   Движения.Количество.Записывать = Истина;
   Движение = Движения.Количество.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
   Движение.Период = Дата;
   Движение.Номенклатура = Номенклатура;
   Движение.Количество = Количество;

   // регистр Сумма Расход
   Движения.Сумма.Записывать = Истина;
   Движение = Движения.Сумма.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
   Движение.Период = Дата;
   Движение.Номенклатура = Номенклатура;
   Движение.Сумма = Стоимость;

   

   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

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

КонецПроцедуры // БронированиеТоваровНаСервере()
11 НафНаф
 
25.03.13
21:50
(9) технически да
(8) так как же недостаточно параметров, если он необязательный?
12 Dmitry017
 
25.03.13
21:50
только честно говоря, я не особо понял что существенного изменилось. Вроде бы всё то же самое только другими словами. Или я не прав? Можете подсказать?
14 GROOVY
 
25.03.13
21:52
(11) Ну вот такой он необязательно/обязательный.

ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
Записать(ПараметрыЗаписи);
15 НафНаф
 
25.03.13
21:52
УФ намутили...
16 zak555
 
25.03.13
21:53
(9) ЭтотОбъект не нужен ?
17 GROOVY
 
25.03.13
21:54
(16) Нет.
18 НафНаф
 
25.03.13
21:55
(14) накуа это все было так усложнять, вопрос остался
19 GROOVY
 
25.03.13
21:59
(18) ИМХО, кто то более разумный синтаксис в УФ делал чем в объектной модели, и параметры передавать параметрами решил, а не через запятую. А другой товарищ при описании метода закопипастил описание метода "Записать()" и не учет что параметры теперь обязательные.
20 Dmitry017
 
25.03.13
23:15
Аналогичная задача - но только для нескольких документов сразу. Т.е. Имеется форма списка и там несколько документов. И их надо забронировать.

В модуле объекта документа написал:
&НаСервере
Процедура ВыполнитьБронирование(ТекДок) Экспорт

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

КонецПроцедуры // ВыполнитьБронирование()


Затем создал команду, БроньСнаружи, которая имеет следующие свойства:
Группа: Командная панель формы.Важное
Параметры:
ДокументСсылка.РасходнаяНакладная

А вот это находится в модуле команды:

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

// <Описание процедуры>
//
// Параметры
//  <Параметр1>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>
//  <Параметр2>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>
//
&НаСервере
Процедура ВызыватьВыполнениеБронированияНаСервере(СсылкаНаДокумент)

   Документы.РасходнаяНакладная.ВыполнитьБронирование(СсылкаНаДокумент);

КонецПроцедуры // ВызыватьВыполнениеБронированияНаСервере()

В результате ошибка в процессе выполнения:

{Документ.РасходнаяНакладная.Команда.БроньСнаружи.МодульКоманды(22)}: Метод объекта не обнаружен (ВыполнитьБронирование)
   Документы.РасходнаяНакладная.ВыполнитьБронирование(СсылкаНаДокумент);
21 grayshadow
 
25.03.13
23:27
может объект не инициализирован?
вот это
Процедура ВыполнитьБронирование(ТекДок) Экспорт
попробуйте перекинуть в модуль менеджера
22 GROOVY
 
25.03.13
23:28
В модуле объекта нафига директивы компиляции?
23 GROOVY
 
25.03.13
23:30
Зачем вообще мучать модуль объекта при групповой обработке?

(20) Та понимаешь контекст исполнения модуля объекта, от контекста исполнения модуля формы или модуля менеджера? ИМХО, нет. Надо тут подтянуть знания.
24 GROOVY
 
25.03.13
23:31
Документы.РасходнаяНакладная.ВыполнитьБронирование(СсылкаНаДокумент);  - так можно обратиться только к модулю менеджера.
25 GROOVY
 
25.03.13
23:31
Для обращения к процедуре в модуле объекта нужно это объект получить.
26 НафНаф
 
26.03.13
06:49
(19) "кто то более разумный синтаксис в УФ делал чем в объектной модели, и параметры передавать параметрами решил, а не через запятую"

В чем разумность? В том, что писать нужно больше, а передать чушь?
Параметры передаются всегда параметрами, это как масло масляное
Независимо от того, куда вы едете — это в гору и против ветра!