Имя: Пароль:
1C
1С v8
Записать документ 8.2
, ,
0 padaril
 
13.10.11
12:19
Не могу записать документ.
Объект.Записать(); - не хочет
Пытался получить объект:
ЭтотОбъект = Объект.Ссылка.ПолучитьОбъект();
ЭтотОбъект.Записать();
Еще не установлена ссылка.
1 ДенисЧ
 
13.10.11
12:20
не хочет - это очень подробное описание ошибки... Мы сразу поняли, что ей надо. Но тебе не скажем.
2 luckyluke
 
13.10.11
12:20
(0) Что за объект? Почему не хочет? Как создавал?
3 ponaroshku
 
13.10.11
12:21
(0)
что делаешь?:)
4 PCcomCat
 
13.10.11
12:22
Объект.Записать(РежимЗаписиДокумента.Записать); ?????
5 PCcomCat
 
13.10.11
12:24
"Пытался получить объект:
ЭтотОбъект = Объект.Ссылка.ПолучитьОбъект();
ЭтотОбъект.Записать();"
- Это вообще на грани фантастики - изменять можно только объект, а ссылки можно читать.
6 Vakhrin
 
13.10.11
12:24
(4) по умолчанию
7 padaril
 
13.10.11
12:25
Суть задачи - ввод на основании с проверкой наличия уже существующего введенного на основании документа. Понимаю, что делаю через задницу - но все же. Более нормального пути не нашел еще. Сначала пробовал в обработке заполнения вводимого на основании документа - но столкнулся с другими препятствиями и решил пойти так.

&НаКлиенте
Процедура Реализация(Команда)
   СсылкаНаДокумент = СозданиеОткрытиеРеализации();
   ОткрытьЗначение(СсылкаНаДокумент);
КонецПроцедуры
   
&НаСервере
Функция СозданиеОткрытиеРеализации()
   ЭтотОбъект = Объект.Ссылка.ПолучитьОбъект();
   ЭтотОбъект.Записать();
   ЗапросНаличия = Новый Запрос("ВЫБРАТЬ
                                |    РеализацияТоваров.Ссылка
                                |ИЗ
                                |    Документ.РеализацияТоваров КАК РеализацияТоваров
                                |ГДЕ
                                |    РеализацияТоваров.Основание = &Основание");
   ЗапросНаличия.УстановитьПараметр("Основание", Объект.Ссылка);
   ВыборкаНаличия = ЗапросНаличия.Выполнить().Выбрать();
   Если ВыборкаНаличия.Следующий() Тогда
       СсылкаНаДокумент = ВыборкаНаличия.Ссылка;
   Иначе
       НовДок = Документы.РеализацияТоваров.СоздатьДокумент();
       НовДок.Дата = ТекущаяДата();
       НовДок.Контрагент = Объект.Контрагент;
       НовДок.Основание = Объект.Ссылка;
       Для Каждого ТС Из Объект.ТабличнаяЧасть1 Цикл
           НоваяСтрока = НовДок.Товары.Добавить();
           НоваяСтрока.Количество = ТС.Количество;
           НоваяСтрока.Номенклатура = ?(ЗначениеЗаполнено(ТС.НоменклатураЗамена), ТС.НоменклатураЗамена, ТС.Номенклатура);
           НоваяСтрока.ЕдиницаИзмерения = ТС.Номенклатура.ЕдиницаИзмерения;
           НоваяСтрока.СуммаВсего = ТС.Сумма;
           НоваяСтрока.Цена = ТС.Цена;
       КонецЦикла;
       НовДок.Записать();
       СсылкаНаДокумент = НовДок.Ссылка;
   КонецЕсли;
   Возврат СсылкаНаДокумент;
КонецФункции
8 padaril
 
13.10.11
12:27
Объект.Записать();
{Документ.Заказ.Форма.ФормаДокумента.Форма(56)}: Метод объекта не обнаружен (Записать)
   Объект.Записать();
9 PCcomCat
 
13.10.11
12:27
Объект откуда берется?
10 PCcomCat
 
13.10.11
12:28
(8) Я тоже по тексту не пойму, какой объект нужно записать.
11 padaril
 
13.10.11
12:32
Объект нужно записать тот, на основании которого создается реализация.
Иначе в запрос параметром передается пустая ссылка, и находит реализации с основанием - пустая ссылка
12 Mort
 
13.10.11
12:33
А все оттого что открытие формы нового документа производится через задний проход.
13 padaril
 
13.10.11
12:33
Метод, конечно через голову, может кто-нибудь знает как это можно реализовать в обработке заполнения реализации?
14 PCcomCat
 
13.10.11
12:34
Где это все происходит? В модуле формы Заказа?
15 Vakhrin
 
13.10.11
12:35
&НаКлиенте
Процедура Реализация(Команда)
   Записать();
   СсылкаНаДокумент = СозданиеОткрытиеРеализации();
   ОткрытьЗначение(СсылкаНаДокумент);
КонецПроцедуры
   
&НаСервере
Функция СозданиеОткрытиеРеализации()
   ЗапросНаличия = Новый...
и т.д.
16 padaril
 
13.10.11
12:35
Перед заполнением необходимо проверить, есть ли уже созданный на основании (реадизовано запросом), и если есть - открыть найденный документ а текущий не открывать, если нет - обычное заполнение.
17 PCcomCat
 
13.10.11
12:36
(16) Это уже все поняли! А ОБЪЕКТ - это у тебя что?
18 padaril
 
13.10.11
12:37
&НаКлиенте
Процедура Реализация(Команда)
   Записать();
...


Спасибо! Не проснулся еще =)

Все же, может лучше делать через обработку заполнения?
19 padaril
 
13.10.11
12:37
(17) Объект - Это заказ.
20 padaril
 
13.10.11
12:38
На основании заказа создать реализацию.
21 PCcomCat
 
13.10.11
12:38
Судя по тексту (телепатируем), то засада здесь:
ЭтотОбъект = Объект.Ссылка.ПолучитьОбъект(); - убрать нафиг!!!
   ЭтотОбъект.Записать();
22 PCcomCat
 
13.10.11
12:39
+(21) Или как в (15) просто
Записать();
23 unregistered
 
13.10.11
12:40
&НаКлиенте
Функция ЗаписатьДокумент(Действие)
  Если Модифицированность ИЛИ ПроверкаНовыйНаСервере() Тогда
    ЗаписатьНаСервере(РежимЗаписиДокумента.Запись);
  КонецЕсли;
  Возврат Истина;
КонецФункции // ЗаписатьДокументОтменивПроведение()

&НаСервере
Функция ПроверкаНовыйНаСервере()
  Об = РеквизитФормыВЗначение("Объект");
  Возврат Об.ЭтоНовый();
КонецФункции // ПроверкаНовыйНаСервере()

&НаСервере
Процедура ЗаписатьНаСервере(Режим)
  Об = РеквизитФормыВЗначение("Объект");
  Об.Записать(Режим);
  ЗначениеВРеквизитФормы(Об, "Объект");
КонецПроцедуры // ЗаписатьНаСервере()
24 unregistered
 
13.10.11
12:41
(22) Записать() на клиенте? А разве это возможно?
25 Mort
 
13.10.11
12:42
Какая жесть. Записывать то накуа?
26 padaril
 
13.10.11
12:43
Да, с этим разобрался!
Сделал как в (15).

Можно ли это реализовать в обработке заполнения документа реализация?
27 PCcomCat
 
13.10.11
12:44
(24) Телепатия - это сила! Все происходит в модуле формы документа.
28 padaril
 
13.10.11
12:49
Думал сделать так: в реализации добавить реквизит ОтказОткрытия,
при проверке на наличие уже созданного на основании - ОтказОткрытия = Истина, и в ПередОткрытием условие: Отказ = ОтказОткрытия.
Но! Как тогда в обработке заполнения открыть найденный документ? Из сервера ведь невозможно открыть форму тонкого клиента.
29 PCcomCat
 
13.10.11
12:51
(26) ОбработкаЗаполнения(Источник, Основание, Отказ).
30 padaril
 
13.10.11
13:01
(29) Если бы...
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
8.2
31 padaril
 
13.10.11
13:15
Так как же правильно реализовать проверку при создании на основании на наличие уже созданного документа? Никто не сталкивался с такой необходимостью?
32 padaril
 
13.10.11
13:44
Как в обработке заполнения вместо заполняемого документа открыть уже созданный?
33 Wingless
 
13.10.11
13:56
(32) Делай проверку в обработкезаполнения, отказ передавай в ПриСозданииНаСервере через ДополнительныеСвойства.
34 padaril
 
13.10.11
14:09
Ок, передам отказ в ПриСозданииНаСервере, но где и как смогу открыть созданный ранее документ выявленный проверкой?
35 vmv
 
13.10.11
14:11
(34) на клиенте, ссылки можно передавать в массиве с кллиента на сервер и обратно, ваш КО
36 padaril
 
13.10.11
14:18
Все же пройдя процедуру ОбработкаЗаполнения, документ создается. А отказ в процедуре ПриСозданииНаСервере лишь его не откроет. Было бы идеально установить эту проверку до создания нового документа Реализация и попадания в процедуру ОбработкаЗаполнения. Но как?!
37 Vakhrin
 
13.10.11
14:34
&НаКлиенте
Процедура СоздатьНаОсновании(Команда)
   Записать();
   НовыйОбъект = СоздатьНаОснованииНаСервере();
   НовыйОбъект.ПолучитьФорму().Открыть();
КонецПроцедуры

&НаСервере
Функция СоздатьНаОснованииНаСервере()
   // тут можно проверку на уже существующий
   // с возвратом полученного объекта/ссылка для открытия
   НовыйОбъект = Документы.РеализацияТоваров.СоздатьДокумент();
   НовыйОбъект.Заполнить(Объект.Ссылка);
   НовыйОбъект.Дата = ТекущаяДата();
   НовыйОбъект.УстановитьНовыйНомер();
   Возврат НовыйОбъект;
КонецФункции
38 Wingless
 
13.10.11
14:38
(37)
>>НовыйОбъект.ПолучитьФорму().Открыть();
Круто. Как сам думаешь, это будет работать?
39 Vakhrin
 
13.10.11
14:40
(38) даже проверил )
40 padaril
 
13.10.11
14:44
В итоге сделал вот так:

&НаКлиенте
Процедура Реализация(Команда)
   Записать();
   СсылкаНаДокумент = СозданиеОткрытиеРеализации();
   Если СсылкаНаДокумент = Неопределено Тогда
       ОткрытьФорму("Документ.РеализацияТоваров.Форма.ФормаДокумента", Новый Структура("Основание", Объект.Ссылка));
   Иначе
       ОткрытьЗначение(СсылкаНаДокумент);
   КонецЕсли;
КонецПроцедуры
   
&НаСервере
Функция СозданиеОткрытиеРеализации()
   ЗапросНаличия = Новый Запрос("ВЫБРАТЬ
                                |    РеализацияТоваров.Ссылка
                                |ИЗ
                                |    Документ.РеализацияТоваров КАК РеализацияТоваров
                                |ГДЕ
                                |    РеализацияТоваров.Основание = &Основание");
   ЗапросНаличия.УстановитьПараметр("Основание", Объект.Ссылка);
   ВыборкаНаличия = ЗапросНаличия.Выполнить().Выбрать();
   Если ВыборкаНаличия.Следующий() Тогда
       СсылкаНаДокумент = ВыборкаНаличия.Ссылка;
   Иначе
       СсылкаНаДокумент = Неопределено;
   КонецЕсли;
   Возврат СсылкаНаДокумент;
КонецФункции
41 padaril
 
13.10.11
14:45
но на форме (упр. прил) вкладка "Создать на основании" и рядом кнопка "Создать Расход".
Поэтому и хотел все прописать иначе.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.