Добрый день!
Платформа 8.3.6.2390
Помогите пожалуйста создать счет-фактуру из документа как в бухгалтерии 3.0

 На картинках как нужно
 Базу прилагаю

проверить записан ли и проведен ли документ
 если документ проведен программно создать счет-фактуру(можно "создать на основании") и заполнить в ней поля:
 - номер
 - дата
 - ссылка на документ поступления
 - сумма НДС
 - сумма Всего

  на форме документа поступления сменить в группе "ГруппаСчетФактураСтраницы" с "ГруппаЗарегистрироватьСчетФактуру" на "ГруппаСчетФактураСсылка" и добавить там ссылку на созданную счет-фактуру и вывести суммы из нее
  сделать проверку на предмет удаления или ручного изменения счет-фактуры (соответственно при открытии формы документа поступления)
  такой механизм есть в бухгалтерии предприятия 3.0 но я не разобралась :(
---
qqwweerrttyy160679, ну как бы " НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);" А проверить, проведен ли текущий документ, можно по признаку "проведен":

Код
  Если Объект.Проведен Тогда
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение)
  Иначе
    Сообщить("Сначала проведите документ, а уж потом счета-фактуры создавайте, деревня!");
  КонецЕсли;
Показать полностью
---
qqwweerrttyy160679, если есть команда ввода на основании, то в ней уже должна быть реализована нужная логика. Обычно при программном создании все сводится к созданию нового объекта и вызову метода "Заполнить", в который передается документ-основание. Если это делается на форме, то смотрите описание метода "ОткрытьФорму", в который можно передать документ-основание.
---
starik-2005,
Делаю так:

через конструктор ввода на основании делаю

```1c
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
    // Заполнение шапки
    Договор = ДанныеЗаполнения.Договор;
    Контрагент = ДанныеЗаполнения.Контрагент;
    Организация = ДанныеЗаполнения.Организация;
    Склад = ДанныеЗаполнения.Склад;
    ДокументОснование = ДанныеЗаполнения.Ссылка;
    СуммаНДСДокумента = ДанныеЗаполнения.СуммаНДСПоСФ;
    СуммаДокумента = ДанныеЗаполнения.СуммаСНДСПоСФ;
    КонецЕсли;
    //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    КонецПроцедуры
```

в модкле формы документа пишу

```1c
    НовыйДокумент = Документы.СчетФактураПолученный.СоздатьДокумент();
    НовыйДокумент.Заполнить(ДанныеЗаполнения);
    НовыйДокумент.Записать();
```

не нравится "Документы" пишет - Переменная не определена (Документы)
---
qqwweerrttyy160679, переменная Документы только на сервере доступна...
---
qqwweerrttyy160679, Команда которую вы в форме на клиенте вызываете, должна вызвать серверную процедуру, т.к. "Документы" как правильно заметили выше недоступны в контексте клиента.

Должно быть примерно так:

```1c
    &НаСервере
    Процедура СоздатьСФНаСервере(ДанныеЗаполнения)
    НовыйДокумент = Документы.СчетФактураПолученный.СоздатьДокумент();
    НовыйДокумент.Заполнить(ДанныеЗаполнения);
    НовыйДокумент.Записать();
    КонецПроцедуры

    &НаКлиенте
    Процедура КомандаСоздатьСФ(Команда)
    ДанныеЗаполнения...(заполняете что вам нужно для создания СФ)
    СоздатьСФНаСервере(ДанныеЗаполнения);
    КонецПроцедуры
```
---
alexx2510,
я в принципе уже примерно так и написала вот только как провести созданный документ
---
qqwweerrttyy160679, чем не нравится типовой механизм, типа:

```1c
    Результат = УчетНДСВызовСервера.СоздатьСчетФактуруПолученныйНаОсновании(Основание, НомерСчетаФактуры, Форма.ДатаСчетаФактурыПолученного,
    ?(ЭтоКомиссияНаЗакупку, Форма.Продавец, Неопределено), СтруктураОтбора);
```
---
alexx2510,
я вот примерно так пишу

```1c
    &НаСервере
    Функция СоздатьСчетФактуру (ДанныеЗаполнения)

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

    Возврат НовыйДокумент.Ссылка;

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

    &НаКлиенте
    Процедура ЗарегистрироватьСчетФактуру(Команда)

    ДанныеЗаполнения = Новый Структура("ЗначенияЗаполнения", Новый Структура());

    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("Номер", Объект.Номер);
    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("Дата", Объект.Дата);
    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("Организация", Объект.Организация);
    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("Склад", Объект.Склад);
    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("Контрагент", Объект.Контрагент);
    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("Договор", Объект.Договор);
    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("ДокументОснование", Объект.Ссылка);
    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("СуммаНДСДокумента", Объект.СуммаНДСПоСФ);
    ДанныеЗаполнения.ЗначенияЗаполнения.Вставить("СуммаДокумента", Объект.СуммаСНДСПоСФ);

    СсылкаНаСчетФактуру = СоздатьСчетФактуру(ДанныеЗаполнения);

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

Поля в созданной счет-фактуре не заполняются, хотя в отладчике они видны на сервере
---
qqwweerrttyy160679, попробуйте так: "СсылкаНаСчетФактуру = СоздатьСчетФактуру(Объект.Ссылка);"
---
starik-2005,

Так вообще хорошо получается

```1c
    &НаСервере
    Функция СоздатьСчетФактуру (ДанныеЗаполнения)

    НовыйДокумент = Документы.СчетФактураПолученный.СоздатьДокумент();

    НовыйДокумент.Заполнить(ДанныеЗаполнения);
    НовыйДокумент.Дата = ТекущаяДата();
    НовыйДокумент.Номер = 1111;

    НовыйДокумент.Записать();

    Возврат НовыйДокумент.Ссылка;

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

    &НаКлиенте
    Процедура ЗарегистрироватьСчетФактуру(Команда)

    СсылкаНаСчетФактуру = СоздатьСчетФактуру(Объект.Ссылка);

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

А как провести созданный документ ????
и как проверить перед созданием счет-фактуры проведен ли документ поступления???????
---
qqwweerrttyy160679, ну как бы " НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);" А проверить, проведен ли текущий документ, можно по признаку "проведен":

Код
  Если Объект.Проведен Тогда
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение)
  Иначе
    Сообщить("Сначала проведите документ, а уж потом счета-фактуры создавайте, деревня!");
  КонецЕсли;
Показать полностью
---
starik-2005,

```1c
    Записать(РежимЗаписиДокумента.Проведение)
```

не проходит, пишет

```1c
    Ошибка при вызове метода контекста (Записать)
    Записать(РежимЗаписиДокумента.Проведение)
    по причине:
    Несоответствие типов (параметр номер '1')
```

Решила таким образом

```1c
    Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
```
---
qqwweerrttyy160679,

То есть
```1c
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение)
```
 срабатывает только &НаСервере когда я записываю созданный документ счета-фактуры, а в самом документе приходной накладной проверяю проведен ли документ &НаКлиенте и если он не проведен, то провожу его программно прямо с клиента
```1c
    Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
```
---
Вот конечный вариант

```1c
    &НаСервере
    Функция СоздатьСчетФактуру (ДанныеЗаполнения)

    НовыйДокумент = Документы.СчетФактураПолученный.СоздатьДокумент();

    НовыйДокумент.Заполнить(ДанныеЗаполнения);
    НовыйДокумент.Дата = ТекущаяДата();
    НовыйДокумент.Номер = 11111;

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

    Возврат НовыйДокумент.Ссылка;

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

    &НаКлиенте
    Процедура ЗарегистрироватьСчетФактуру(Команда)

    Если Не Объект.Проведен Тогда

    Режим = РежимДиалогаВопрос.ДаНет;
    Ответ = Вопрос("Создание счета-фактуры возможно только после
    |проведения документа поступления! Провести документ?",Режим, 0);
    Если Ответ = КодВозвратаДиалога.Нет Тогда
    Возврат;
    КонецЕсли;

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

    СсылкаНаСчетФактуру = СоздатьСчетФактуру(Объект.Ссылка);

    Элементы.ГруппаЗарегистрироватьСчетФактуру.Видимость = Ложь;
    Объект.СчетФактура = СсылкаНаСчетФактуру;
    Объект.Реквизит1 = СсылкаНаСчетФактуру;
    Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));

    КонецЕсли;

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

ну еще плюс плюшки дописать при изменении самой счет фактуры без документа или её удаление чтобы в накладной изменялась информация
---
qqwweerrttyy160679, если вы делаете конфигурацию под 8.3.6, то модальные окна не стоит использовать.
Т.е. вот от такого кода лучше отказаться:

```1c
    Ответ = Вопрос("Создание счета-фактуры возможно только после
    |проведения документа поступления! Провести документ?",Режим, 0);
    Если Ответ = КодВозвратаДиалога.Нет Тогда
    Возврат;
    КонецЕсли;
```

И заменить его на код с использованием Оповещения. Вот здесь про это можно почитать как это сделать: http://v8.1c.ru/o7/201312ref/index.htm
---
alexx2510,
Мне очень нравится модальные окна, они на мой взгляд очень удобные и информативные.
Вот если я буду писать под мобильные приложения, тогда да, откажусь.
Это чисто мнение мое и никому его не навязываю :)
---
qqwweerrttyy160679, Мне очень нравится модальные окна, они на мой взгляд очень удобные и информативные. - стесняюсь спросить: чем они такие удобные, и где информативные? Чем диалог "Вопрос", к примеру, отличается от "ПоказатьВопрос"?
---
qqwweerrttyy160679, если у вас типовая конфигурация(куда вы этот код вставляете), то вы себе добавите лишних проблем при обновлении(как минимум в части свойства "Использование модальности")