В обработке Диадок переходим в настройки. Нажимаем на кнопку "сохранить шаблон подключаемого модуля на диск" (лучше заранее сохранить пустую обработку и ее выбрать). Путь к файлу я делаю через сетевую папку.
Получаем обработку шаблон.
Переходим в модуль обработки. Нас интересует функция ОбработкаСобытияПодключаегогоМодуля()
А в ней нужно разкомментировать событие ПослеОбновленияКонтента
тип контента Utd820SellerContent это УПД. В УПД как правило я больше всего вношу изменеий перед отправкой.
Столкнулся с проблемой невозможности подключить отладку в данном модуле.
Поэтому допилим костыль сохраним в текстовый файл Структуру Параметры.Content
ТекстПротоконтент = ЗначениеВСтрокуВнутр(Протоконтент);
Текст = Новый ЗаписьТекста;
Текст.Открыть("\\Server\1c\Протоконтент.txt",КодировкаТекста.ANSI);
Текст.ЗаписатьСтроку(ТекстПротоконтент);
Текст.Закрыть();
А потом в другой обработке в отладчике уже посмотрим содержимое этой структуры. В этой структуре и нужно менять данные. Чтобы УПД на сайт Диадока выгрузилась в измененном виде.
&НаСервере
Процедура Команда1НаСервере()
Текст = Новый ТекстовыйДокумент;
ПолноеИмяФайла = "\\server\1с\Протоконтент.txt";
Текст.Прочитать(ПолноеИмяФайла);
ТекСтрока1 = "";
КоличествоСтрок = Текст.КоличествоСтрок();
Для Счетчик = 1 по КоличествоСтрок Цикл
ТекСтрока = Текст.ПолучитьСтроку(Счетчик);
ТекСтрока1 = ТекСтрока1 + ТекСтрока;
КонецЦикла;
Протоконтент = ЗначениеИзСтрокиВнутр(ТекСтрока1);
КонецПроцедуры
&НаКлиенте
Процедура Команда1(Команда)
Команда1НаСервере();
КонецПроцедуры
#Область ПЕРМЕННЫЕ_ПЛАТФОРМЫ
Перем Манифест Экспорт;
Перем ОбработкаОбъект Экспорт;
Перем СтандартныйМодуль Экспорт;
Перем ПереопределениеВыполнено Экспорт;
Перем НомерИтерацииВызоваМодуля, ПереопределениеВыполненоПредыдущиеЗначения;
#КонецОбласти
#Область ПРОЦЕДУРЫ_И_ФУНКЦИИ_ПЛАТФОРМЫ
Функция МетодСервера(ИмяМодуля= "", ИмяМетода,
Параметр0= NULL, Параметр1= NULL, Параметр2= NULL, Параметр3= NULL, Параметр4= NULL,
Параметр5= NULL, Параметр6= NULL, Параметр7= NULL, Параметр8= NULL, Параметр9= NULL)
Возврат ОбработкаОбъект.МетодСервера(ИмяМодуля, ИмяМетода,
Параметр0, Параметр1, Параметр2, Параметр3, Параметр4,
Параметр5, Параметр6, Параметр7, Параметр8, Параметр9);
КонецФункции
Процедура Инициализировать(ИмяМодуля) Экспорт
Если НомерИтерацииВызоваМодуля = Неопределено Тогда
НомерИтерацииВызоваМодуля= 0;
КонецЕсли;
НомерИтерацииВызоваМодуля= НомерИтерацииВызоваМодуля + 1;
Если ПереопределениеВыполненоПредыдущиеЗначения = Неопределено Тогда
ПереопределениеВыполненоПредыдущиеЗначения= Новый Массив;
КонецЕсли;
ПереопределениеВыполненоПредыдущиеЗначения.Добавить(ПереопределениеВыполнено);
Если Манифест = Неопределено Тогда
ОбработкаОбъект.ЗаполнитьМанифест(ЭтотОбъект, ИмяМодуля);
КонецЕсли;
КонецПроцедуры
Процедура ОчиститьПеременные() Экспорт
// Разрывается циклическая ссылка, для того чтобы исключить утечку памяти.
// Модуль может быть вызван повторно во вложенных методах,
// поэтому очищаем переменные, ТОЛЬКО если это начальная итерация вызова модуля.
// Значение переменной ПереопределениеВыполнено возвращается к предыдущему.
НомерИтерацииВызоваМодуля= НомерИтерацииВызоваМодуля - 1;
Если НомерИтерацииВызоваМодуля = 0 Тогда
ОбработкаОбъект= Неопределено;
ПараметрыКлиентСервер= Неопределено;
СтандартныйМодуль= Неопределено;
КонецЕсли;
ВГраница= ПереопределениеВыполненоПредыдущиеЗначения.ВГраница();
ПереопределениеВыполнено= ПереопределениеВыполненоПредыдущиеЗначения[ВГраница];
ПереопределениеВыполненоПредыдущиеЗначения.Удалить(ВГраница);
КонецПроцедуры
Процедура ПриглашениеОтладки() Экспорт
//// Удалите комментарий напротив оператора "ВызватьИсключение", чтобы получить приглашение для начала отладки модуля.
//ВызватьИсключение "Нажмите кнопку ""Подробно"", а затем ""Конфигуратор"", чтобы начать отладку модуля!";
КонецПроцедуры
#КонецОбласти
#Область МАНИФЕСТ
Функция ФункцииМодуля() Экспорт
Результат = Новый Структура;
ОбработкаОбъект.ДобавитьФункциюВМанифест(Результат, "ОбработкаСобытияПодключаемогоМодуля");
Возврат Результат;
КонецФункции
#КонецОбласти
#Область СведенияОВнешнейОбработке
// Сведения о внешней обработке совместимые со стандартной подсистемой ДополнительныеОтчетыИОбработки
//
// Возвращаемое значение:
// Структура - содержит свойства:
// * Версия - Строка - версия обработки;
// * Наименование - Строка - представление для администратора (наименование элемента справочника),
// берется синоним объекта метаданных внешней обработки;
// * Информация - Строка - краткая информация о внешней обработке,
// берется комментарий объекта метаданных внешней обработки;
// * БезопасныйРежим - Булево - признак подключения внешней обработки в безопасном режиме:
// Игнорируется привилегированный режим
// Запрещены внешние по отношению к платформе «1С:Предприятия» действия:
// COM;
// загрузка внешних компонент;
// запуск внешних приложений и команд операционной системы;
// доступ к файловой системе, кроме временных файлов;
// доступ к Интернету.
// * Вид - Строка - содержит значение "ДополнительнаяОбработка";
// * Команды - ТаблицаЗначений - настройки команд, поставляемых внешней обработкой:
// ** Идентификатор - Строка- внутреннее имя команды;
// ** Представление - Строка- пользовательское представление команды;
// ** Использование - Строка- тип команды:
// "ВызовКлиентскогоМетода",
// "ВызовСерверногоМетода";
// ** Модификатор - Строка- дополнительная классификация команды;
// ** ПоказыватьОповещение - Булево- если Истина, то при запуске команды выводится оповещение "Команда выполняется...";
//
Функция СведенияОВнешнейОбработке() Экспорт
МетаданныеОбработки= Метаданные();
ПараметрыРегистрации= Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Версия", ВерсияОбработки());
ПараметрыРегистрации.Вставить("Наименование", МетаданныеОбработки.Синоним);
ПараметрыРегистрации.Вставить("Информация", МетаданныеОбработки.Комментарий);
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд());
НоваяКоманда= ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление= МетаданныеОбработки.Синоним;
НоваяКоманда.Идентификатор= "ВыполнитьМетод";
НоваяКоманда.Использование= "ВызовСерверногоМетода";
Возврат ПараметрыРегистрации;
КонецФункции
// Версия обработки в стандартном формате
//
// Возвращаемое значение:
// Строка - версия в формате РР.ВВ.ФФ.СС, где:
// * РР - номер редакции - в рамках одной редакции гарантируется обратная совместимость;
// * ВВ - номер версии - новая функциональность (или несколько);
// * ФФ - номер исправления - исправление ошибки;
// * СС - номер сборки - в ПМ не используется;
Функция ВерсияОбработки()
Версия = "1.5.1.0";
Возврат Версия;
КонецФункции
Функция ТаблицаКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ВыполнитьМетод" Тогда
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ПРИМЕРЫ
&НаКлиенте
Функция ПримерФункции(ОбязательныйПараметр, НеобязательныйПараметр= Неопределено) Экспорт
#Область Пример_переопределения_логики_стандартной_функции
// ПереопределениеВыполнено= Истина;
//
// // Код новой логики:
//
// Возврат ОбязательныйПараметр + " + ПереопределенныйРезультат";
#КонецОбласти
#Область Пример_изменения_параметров_стандартной_функции
// В таком случае НЕ добавляем в код конструкцию "ПереопределениеВыполнено= Истина", а просто изменяем параметры.
// Далее система сама выполнит стандартную функцию с новыми параметрами.
//
// ОбязательныйПараметр= "ПереопределенноеЗначениеПараметра";
//
// НеобязательныйПараметр= "";
#КонецОбласти
#Область Пример_изменения_результата_стандартной_функции
// ПереопределениеВыполнено= Истина;
//
// Результат= СтандартныйМодуль.ПримерФункции(ОбязательныйПараметр, НеобязательныйПараметр); // Обращаемся напрямую к функции стандартного модуля
//
// //Изменение результата стандартной функции:
//
// Результат= Результат + " + ИзменениеРезультатаЧерезПереопределение";
// Результат= Результат + МетодСервера("Модуль_ЛюбойСтандартный","ЛюбаяСтандартнаяЭкспортнаяФункция", ОбязательныйПараметр, НеобязательныйПараметр);
//
// Результат= МетодСервера("Модуль_ЛюбойСтандартный","ЛюбаяСтандартнаяЭкспортнаяПроцедура", Результат);
//
// Возврат Результат;
#КонецОбласти
КонецФункции
&НаКлиенте
Процедура ПримерПроцедуры(ОбязательныйПараметр, НеобязательныйПараметр= Неопределено) Экспорт
#Область Пример_переопределения_логики_стандартной_процедуры
// ПереопределениеВыполнено= Истина;
//
// // Код новой логики:
//
// ОбязательныйПараметр= ОбязательныйПараметр + " НовыйРезультатПереопределения";
#КонецОбласти
#Область Пример_изменения_параметров_стандартной_процедуры
// В таком случае НЕ добавляем в код конструкцию "ПереопределениеВыполнено= Истина", а просто изменяем параметры.
// Далее система сама выполнит стандартную процедуру с новыми параметрами.
// ОбязательныйПараметр= "ПереопределенноеЗначениеПараметра";
//
// НеобязательныйПараметр= "";
#КонецОбласти
#Область Пример_изменения_параметров_после_выполнения_стандартной_процедуры
// ПереопределениеВыполнено= Истина;
//
// СтандартныйМодуль.ПримерПроцедуры(ОбязательныйПараметр, НеобязательныйПараметр); // Обращаемся напрямую к процедуре стандартного модуля
//
// ОбязательныйПараметр= ОбязательныйПараметр + " + ИзменениеРезультатаЧерезПереопределение";
// ОбязательныйПараметр= ОбязательныйПараметр + МетодСервера("Модуль_ЛюбойСтандартный","ЛюбаяСтандартнаяЭкспортнаяФункция", ОбязательныйПараметр, НеобязательныйПараметр);
//
// ОбязательныйПараметр= МетодСервера("Модуль_ЛюбойСтандартный","ЛюбаяСтандартнаяЭкспортнаяПроцедура", ОбязательныйПараметр);
#КонецОбласти
КонецПроцедуры
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Функция ОбработкаСобытияПодключаемогоМодуля(ИмяСобытия, ПараметрыСобытия = Неопределено) Экспорт
Если ИмяСобытия = "ПослеЗаполненияКонтента" Тогда
//ОбработатьСобытиеПослеЗаполненияКонтента(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "ПолучитьНоменклатуру1С" Тогда
//Возврат ОбработатьСобытиеПолучитьНоменклатуру1С(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "ПослеЗаполненияНовогоДокументаПоступления" Тогда
//ОбработатьСобытиеПослеЗаполненияНовогоДокументаПоступления(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "ПередОбновлениемСпискаДокументовДляСопоставленияСНакладной" Тогда
//ОбработатьСобытиеПередОбновлениемСпискаДокументовДляСопоставленияСНакладной(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "ПослеПолученияТаблицыДокументовДляОтправки" Тогда
//ОбработатьСобытиеПослеПолученияТаблицыДокументовДляОтправки(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "НайтиДокумент1С" Тогда
//Возврат ОбработатьСобытиеНайтиДокумент1С(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "ПолучитьПараметрыОтправкиВПФЧерезДиадок" Тогда
//Возврат ПолучитьПараметрыОтправкиВПФЧерезДиадок(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "КомментарийDocumentToSend" Тогда
//Возврат ОбработатьСобытиеКомментарийDocumentToSend(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "ПередОтправкойPackageSendTask" Тогда
//ОбработатьСобытиеПередОтправкойPackageSendTask(ПараметрыСобытия);
ИначеЕсли ИмяСобытия = "ПриОбновленииСпискаДокументов" Тогда
//ОбработатьСобытиеПриОбновленииСпискаДокументов(ПараметрыСобытия);
КонецЕсли;
КонецФункции
#КонецОбласти
#Область ОбработчикиСобытий
// Позволяет дополнить/изменить контент электронного документа
// перед его отправкой.
//
// Параметры
// Параметры - Структура - Содержит коллекцию, переданных параметров:
// * ТипКонтента - Строка - идентификатор типа контента (см. ТипыКонтента());
// * Content - Структура - Протоконтент исходящего документа;
// * ДокументСсылка - ЛюбаяСсылка - Ссылка на документ информационной базы, по которому собирается протоконтент;
// * DocumentType - Строка - (Устарел) Позволяет определить тип протоструктуры.
// Параметр сохранен для обратной совместимости с ПМ версии 1.4 или ниже.
// Рекомендуется вместо него ориентироваться на ТипКонтента.
//
// Возвращаемое значение:
// Структура - Протоконтент электронного документа.
//
Процедура ОбработатьСобытиеПослеЗаполненияКонтента(Параметры)
ТипыКонтента = ТипыКонтента();
СсылкаНаДокумент = Параметры.ДокументСсылка;
Протоконтент = Параметры.Content;
ТипКонтента = Параметры.ТипКонтента;
Если ТипКонтента = ТипыКонтента.Utd820SellerContent Тогда
//ПримерОбработкиУПД820(СсылкаНаДокумент, Протоконтент);
ИначеЕсли ТипКонтента = ТипыКонтента.UtdSellerContent Тогда
//ПримерОбработкиУПД155(СсылкаНаДокумент, Протоконтент);
ИначеЕсли ТипКонтента = ТипыКонтента.Torg12SellerContent Тогда
//ПримерОбработкиНакладной172(СсылкаНаДокумент, Протоконтент);
ИначеЕсли ТипКонтента = ТипыКонтента.AcceptanceCertificateSellerContent Тогда
//ПримерОбработкиАкта172(СсылкаНаДокумент, Протоконтент);
КонецЕсли;
КонецПроцедуры // ОбработатьСобытиеПослеЗаполненияКонтента()
// <Функция предназначена для кастомного переопределения номенклатуры 1С>
//
// Параметры
// Параметры - <Структура> - Содержит коллекцию, переданных параметров
// Возвращаемое значение:
// НоменклатураСсылка - Возвращает ссылку на элемент справочника "Номенклатура"
//
Функция ОбработатьСобытиеПолучитьНоменклатуру1С(Параметры)
ПереопределениеВыполнено = Истина;
НайденнаяНоменклатура = Параметры.НайденнаяНоменклатура;
Контрагент = Параметры.Контрагент;
КодНоменклатуры = Параметры.КодНоменклатуры;
АртикулНоменклатуры = Параметры.АртикулНоменклатуры;
НаименованиеНоменклатуры = Параметры.НаименованиеНоменклатуры;
Возврат Справочники.Номенклатура.НайтиПоНаименованию("товар из ПМ");
КонецФункции // ОбработатьСобытиеПолучитьНоменклатуру1С()
// <Процедура предназначена для изменения содержания нового (еще не записанного в базу) документа поступления>
//
// Параметры
// Параметры - <Структура> - Содержит коллекцию, переданных параметров
Процедура ОбработатьСобытиеПослеЗаполненияНовогоДокументаПоступления(Параметры)
ДокументОбъект = Параметры.ДокументОбъект;
СтруктураКонтента = Параметры.СтруктураКонтента;
ДокументОбъект.Комментарий = "Комментарий ПМ";
КонецПроцедуры //ОбработатьСобытиеПослеСозданияСчетФактуры()
// Процедура предназначена для изменения запроса обновления списка документов для сопоставления с накладной или счет-фактурой
//
// Параметры
// Параметры - <Структура> - Содержит коллекцию, переданных параметров
Процедура ОбработатьСобытиеПередОбновлениемСпискаДокументовДляСопоставленияСНакладной(Параметры)
Запрос = Параметры.Запрос;
Режим = Параметры.Режим;
МассивКонтрагентов = Запрос.Параметры.МассивКонтрагентов;
Организация = Запрос.Параметры.Организация;
ДатаНачала = Запрос.Параметры.ДатаНачала;
ДатаОкончания = Запрос.Параметры.ДатаОкончания;
DocumentDate = Параметры.DocumentDate;
DocumentType = Параметры.DocumentType;
DocumentFunction = Параметры.DocumentFunction; // функция УПД
DocumentDirection = Параметры.DocumentDirection; // направление документа "Outbound"/"Inbound"
СуммаДокумента = Параметры.СуммаДокумента;
СуммаУвеличение = Параметры.СуммаУвеличение; // для DocumentType = "InvoiceCorrection" или DocumentType = "InvoiceCorrectionRevision"
СуммаУменьшение = Параметры.СуммаУменьшение; // для DocumentType = "InvoiceCorrection" или DocumentType = "InvoiceCorrectionRevision"
// Текст запроса должен содержать обязательные поля:
// Контрагент
// Организация
// ДокументСсылка
// Дата
// Номер
// ДатаВходящегоДокумента
// НомерВходящегоДокумента
// Сумма
// если Режим = "Сопоставление" и (DocumentType = "InvoiceCorrection" или DocumentType = "InvoiceCorrectionRevision"),
// то также должны присутствовать поля:
// СуммаУвеличение
// СуммаУменьшение
// Запрос.Текст = произвольный текст запроса с обязательными полями.
КонецПроцедуры
// Процедура предназначена для изменения стандартной таблицы отправки документов.
// Вызывается после выполнения метода СформироватьТЗВыгрузкиВДиадок
// в процедуре СформироватьТаблицуЗначенийДокументовДляОтправкиДиадок модуля Форма_Выгрузка.
//
// Параметры
// Параметры - <Структура> - Содержит коллекцию, переданных параметров
//
// Состав структуры:
// ТаблицаДокументов - <ТаблицаЗначений> - Таблица документов на отправку, полученная стандартным методом.
// МассивОрганизаций - <Массив> - Отбор по организации 1С.
// МассивКонтрагентов - <Массив> - Отбор по контрагенту 1С.
// ДатаНачала - <Дата> - Отбор по начальной дате документов.
// ДатаОкончания - <Дата> - Отбор по конечной дате документов.
// ТипыДокументов - <Строка> - Отбор по типам электронных документов: "0" - Все документы
// "1" - Накладные
// "2" - Счета-фактуры
// "3" - Счета на оплату
// "4" - Акты сверок
// "5" - УПД Счф Доп
//
Процедура ОбработатьСобытиеПослеПолученияТаблицыДокументовДляОтправки(Параметры)
МассивОрганизаций = Параметры.МассивОрганизаций;
МассивКонтрагентов = Параметры.МассивКонтрагентов;
ДатаНачала = Параметры.ДатаНачала;
ДатаОкончания = Параметры.ДатаОкончания;
ТипыДокументов = Параметры.ТипыДокументов;
ТаблицаДокументов = Параметры.ТаблицаДокументов;
Для каждого СтрокаТаблицы из ТаблицаДокументов цикл
Если СтрокаТаблицы.ТипДокумента = "Счет-фактура" тогда
СтрокаТаблицы.ТипДокумента = "УПД Счф";
СтрокаТаблицы.ФункцияУПД = "СЧФ";
ИначеЕсли СтрокаТаблицы.ТипДокумента="Торг-12" тогда
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Предназначена для переопределения алгоритма поиска документа 1С по данным входящего документа.
// Вызывается из формы ФормаГрупповаяОбработка.НайтиДокумент1С()
// Если возвращается результат, отличный от Неопределено, стандартный поиск не выполняется.
//
// Параметры:
// ДанныеСтроки - Структура - содержит все значения строки таблицы ТаблицаДокументов формы ФормаГрупповаяОбработка:
// * base64DocId - Строка - идентификатор входящего документа в Диадок в кодировке Base64
// * DocumentType - Строка - тип документа Диадок
// * BoxID - Строка - идентификатор ящика Диадок
// * Организация - СправочникСсылка.<Организация> - организация 1С
// * Контрагент - СправочникСсылка.<Контрагенты> - контрагент 1С
// * Дата - Дата - дата документа Диадок
// * Номер - Строка - номер документа Диадок
// * СуммаДокумента - Число - сумма документа Диадок
// * СписокСсылок - СписокЗначений - коллекция идентификаторов документов Диадок, на который ссылается данный документ.
// Например, для счета-фактуры в данном свойстве будут указаны идентификаторы
// документов-оснований (накладных)
//
// Возвращаемое значение:
// Структура с полями:
// * Ссылка - ДокументСсылка, Неопределено - найденный подходящий документ 1С
// * УжеСопоставлен - Булево - Истина, если найденный документ уже сопоставлен
// * СуммаДокумента - Число - сумма документа
//
Функция ОбработатьСобытиеНайтиДокумент1С(ДанныеСтроки)
ПереопределениеВыполнено = Истина;
Результат = Новый Структура;
Результат.Вставить("Ссылка", Неопределено);
Результат.Вставить("УжеСопоставлен", Ложь);
Результат.Вставить("СуммаДокумента", 0);
// +++ ПРИМЕР для БП 3.0
ЭтоНакладная = Ложь
Или ДанныеСтроки.DocumentType = "UniversalTransferDocument" И Найти(ДанныеСтроки.ТипДокумента, "Счф") = 0 // ищем только УПД с функцией ДОП
Или ДанныеСтроки.DocumentType = "XmlTorg12"
Или ДанныеСтроки.DocumentType = "XmlAcceptanceCertificate";
ЭтоСчетФактура = Ложь
Или ДанныеСтроки.DocumentType = "UniversalTransferDocument" И Найти(ДанныеСтроки.ТипДокумента, "Счф") > 0 // ищем УПД с функцией СЧФДОП или СЧФ
Или Найти(ДанныеСтроки.DocumentType, "Invoice") > 0;
ТекстЗапроса = "";
Если ЗначениеЗаполнено(ДанныеСтроки.Сумма) И ЭтоНакладная Тогда
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваровУслуг.Ссылка КАК Ссылка,
| МАКСИМУМ(ВЫБОР
| КОГДА УжеСопоставленные.Значение ЕСТЬ NULL
| ИЛИ УжеСопоставленные.Значение = """"
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ) КАК УжеСопоставлен,
| СУММА(ПоступлениеТоваровУслуг.СуммаДокумента) КАК СуммаДокумента,
| ЕСТЬNULL(СУММА(РублевыеСуммыДокументовВВалюте.Всего), ПоступлениеТоваровУслуг.СуммаДокумента) КАК СуммаДокументаРуб
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК УжеСопоставленные
| ПО ПоступлениеТоваровУслуг.Ссылка = УжеСопоставленные.Объект
| И (УжеСопоставленные.Свойство = &Свойство)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РублевыеСуммыДокументовВВалюте КАК РублевыеСуммыДокументовВВалюте
| ПО ПоступлениеТоваровУслуг.Ссылка = РублевыеСуммыДокументовВВалюте.Регистратор
|ГДЕ
| ПоступлениеТоваровУслуг.Организация = &Организация
| И ПоступлениеТоваровУслуг.Контрагент = &Контрагент
| И НЕ ПоступлениеТоваровУслуг.ПометкаУдаления
| И ПоступлениеТоваровУслуг.НомерВходящегоДокумента = &НомерВходящегоДокумента
| И НАЧАЛОПЕРИОДА(ПоступлениеТоваровУслуг.ДатаВходящегоДокумента, ДЕНЬ) = &ДатаВходящегоДокумента
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.СуммаДокумента
|
|ИМЕЮЩИЕ
| ЕСТЬNULL(СУММА(РублевыеСуммыДокументовВВалюте.Всего), ПоступлениеТоваровУслуг.СуммаДокумента) = &СуммаДокумента";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Документ.ПоступлениеТоваровУслуг", "Документ." + МетодСервера(, "ПредставлениеДокументов").ПоступлениеТоваровУслуг);
ИначеЕсли ЗначениеЗаполнено(ДанныеСтроки.Сумма) И ЭтоСчетФактура Тогда
// повторить то же, но для счетов-фактур
КонецЕсли;
// --- ПРИМЕР для БП 3.0
Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
Свойство_ИдентификаторДокументаВДиадок = МетодСервера(, "НайтиСвойство", "ИдентификаторДокументаВДиадок");
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Организация", ДанныеСтроки.Организация);
Запрос.УстановитьПараметр("Контрагент", ДанныеСтроки.Контрагент);
Запрос.УстановитьПараметр("ДатаВходящегоДокумента", ДанныеСтроки.Дата);
Запрос.УстановитьПараметр("НомерВходящегоДокумента", ДанныеСтроки.Номер);
Запрос.УстановитьПараметр("СуммаДокумента", ДанныеСтроки.Сумма);
Запрос.УстановитьПараметр("Свойство", Свойство_ИдентификаторДокументаВДиадок);
Запрос.УстановитьПараметр("base64DocId", ДанныеСтроки.base64DocId);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(Результат, Выборка);
КонецЕсли;
Иначе
Результат = Неопределено; // включаем типовую логику
КонецЕсли;
Возврат Результат;
КонецФункции
// Предназначена для указания параметров отправки дополнительных ВПФ
//
// Входящие параметры
// Параметры - Структура - Содержит свойства:
//
// Документ - ДокументСсылка - Документ 1С
// ВнешняяПечатнаяФорма - СправочникСсылка - Ссылка на элемент справочника внешних печатных форм в 1С
//
// Возвращаемое значение:
// Структура - Параметры отправки, могут содержать поля:
//
// Выгружать - Булево - (необязателеный) Ложь, если ВПФ отправлять не нужно.
// Дата - Дата - Дата документа.
// Номер - Строка - Номер документа.
// Сумма - Число - Сумма документа.
// СуммаНДС - Число, Неопределено - Сумма НДС документа, Неопределено если без НДС.
//
// ИмяФайла - Строка - (необязателеный) Имя файла печатной формы
// ФорматФайла - Строка - (необязателеный) Формат, в котором файл будет отправлен.
// Если не указан то формат будет определен по имени файла, если имя файла не указано то формат по умолчанию PDF.
// Должен соответсовать системному перечислению ТипФайлаТабличногоДокумента.
// DocumentType - Строка - (необязателеный) Тип электронного документа, если ВПФ нужно отправить НЕ в качестве Nonformalized.
// Должен соответствовать параметру Type: http://1c-docs.diadoc.ru/ru/latest/AddDocumentFromFile.html
// ДанныеФайла - Структура - (необязателеный) Метаданные файла для отправки,
// Поля структуры должны соответствовать полям производного объекта: http://1c-docs.diadoc.ru/ru/latest/DocumentToSend.html
// Допускаются только поля доступные на запись, поле CustomDocumentId игнорируется.
//
// ДвоичныеДанныеФайла - ДвоичныеДанные - (необязателеный) Файл, который нужно отправить вместо печатной формы,
// формат файла в таком случае может не соответсовать ТипФайлаТабличногоДокумента.
// Например, это может быть файл XML.
//
Функция ПолучитьПараметрыОтправкиВПФЧерезДиадок(Параметры)
ПереопределениеВыполнено = Истина;
Документ = Параметры.Документ;
ВнешняяПечатнаяФорма = Параметры.ВнешняяПечатнаяФорма;
// Пример отправки ВПФ в качестве полуформализованного акта в формате таблицы Excel
Дата = Документ.Дата;
Номер = Документ.Номер;
Сумма = Документ.СуммаДокумента;
СуммаНДС = Неопределено; // без НДС
ФорматФайла = "xlsx";
DocumentType = "AcceptanceCertificate";
ИмяФайла = "Акт " + Номер + " от " + Формат(Дата, "ДФ=dd.MM.yyyy") + "." + ФорматФайла;
Результат = Новый Структура;
Результат.Вставить("ИмяФайла", ИмяФайла);
Результат.Вставить("ФорматФайла", ФорматФайла);
Результат.Вставить("DocumentType", DocumentType);
Результат.Вставить("Дата", Дата);
Результат.Вставить("Номер", Номер);
Результат.Вставить("Сумма", Сумма);
Результат.Вставить("СуммаНДС", СуммаНДС);
// AcceptanceCertificate http://1c-docs.diadoc.ru/ru/latest/ActToSend.html
ДанныеФайла = Новый Структура;
ДанныеФайла.Вставить("Grounds", "Основание документа");
ДанныеФайла.Вставить("Comment", "Комментарий к документу");
// Поля DocumentDate, DocumentNumber, FileName, Total, Vat заполнять не обязательно, типовой модуль заполнит их сам.
Результат.Вставить("ДанныеФайла", ДанныеФайла);
Возврат Результат;
// Пример отправки реестра сертификатов в Excel
Результат = Новый Структура;
Результат.Вставить("ФорматФайла", "xlsx");
Результат.Вставить("DocumentType", "CertificateRegistry");
// Значение полей ИмяФайла, Дата, Номер, Сумма, СуммаНДС оставляем стандартными.
// http://1c-docs.diadoc.ru/ru/latest/CertificateRegistryToSend.html
ДанныеФайла = Новый Структура;
ДанныеФайла.Вставить("Comment", "Комментарий к файлу");
ДанныеФайла.Вставить("NeedRecipientSignature", Ложь); // Ответной подписи не требуется
// Поля DocumentDate, DocumentNumber, FileName заполнять не обязательно, типовой модуль заполнит их сам.
Результат.Вставить("ДанныеФайла", ДанныеФайла);
Возврат Результат;
КонецФункции
// Функция предназначена для пердачи комментария к документу пакета (DocumentToSend) перед его отправкой
//
// Параметры
// Параметры - <Структура> - Содержит коллекцию, переданных параметров
//
// Состав структуры:
// DocumentType - <Строка> - тип документа.
// ДокументСсылка - <ДокументСсылка> - ссылка на документ 1С
// ...
// остальные параметры можно посмотреть в функции ПараметрыДокумента формы Модуль_Выгрузка
//
Функция ОбработатьСобытиеКомментарийDocumentToSend(Параметры)
ПереопределениеВыполнено = Истина;
Документ1С = Параметры.ДокументСсылка;
Комментарий = Документ1С.Комментарий;
Возврат Комментарий;
КонецФункции
// Процедура предназначена для изменения пакета документов (PackageSendTask) перед его отправкой.
//
// Параметры:
// ПараметрыСобытия - Структура - Содержит коллекцию, переданных параметров.
//
// Состав структуры:
// PackageSendTask - Структура - содержит основные свойства объекта PackageSendTask (см. https://diadocsdk-1c.readthedocs.io/ru/latest/ComObjects/PackageSendTask.html):
// * CounteragentId - Строка - идентификатор контрагента
// * FromDepartmentId - Строка - идентификатор подразделения отправителя;
// * ToDepartmentId - Строка - идентификатор подразделения получателя;
// * LockPackage - Булево - признак того, что пакет после отправки должен быть нередактируемым;
// * ProxyBoxId - Строка - идентификатор ящика, промежуточного получателя;
// * ProxyDepartmentId - Строка - идентификатор подразделения в ящике промежуточного получателя;
// ПараметрыПакета - ФиксированнаяСтруктура - содержит ключи:
// * Организация - СправочникСсылка.Организации - организация-отправитель;
// * Получатель - СправочникСсылка.Контрагенты - контрагент-получатель;
// * ДокументыПакета - ФиксированныйМассив - содержит фиксированные структуры со свойствами:
// ** Документ - ЛюбаяСсылка - ссылка на документ учета;
// ** DocumentType - Строка - тип электронного документа в терминах сервиса;
// ** DocumentFunction - Строка, Неопределено - функция электронного документа в терминах сервиса;
// ** ЭтоФайл - Булево - Истина, если вложение является файлом;
// ** ДанныеФайла
// ** СвойстваФайла
// * ПараметрыОтправкиНаСогласование - Структура, Неопределено
//
Процедура ОбработатьСобытиеПередОтправкойPackageSendTask(ПараметрыСобытия)
PackageSendTask = ПараметрыСобытия.PackageSendTask;
ПараметрыПакета = ПараметрыСобытия.ПараметрыПакета;
//...
КонецПроцедуры
// Процедура предназначена для обработки списка документов отправленных / полученных / на согласовании.
// Вызывается после выполнения метода ВернутьВыборкуРНКИСчетовФактурДиадок
// в процедуре ОбработчикОбновлениеСпискаДокументов модуля Форма_Основная, до помещения данных на форму.
//
// Параметры
// Параметры - <Структура> - Содержит коллекцию, переданных параметров
//
// Состав структуры:
// МассивДокументов - <Массив> - массив документов полученных с сервера Диадока.
// Направление - <Строка> - раздел документооборота, принимает значения:
// "Outbound" - отправленные;
// "Inbound" - полученные;
// "OutboundWaitingForSenderSignature" - согласование.
Процедура ОбработатьСобытиеПриОбновленииСпискаДокументов(Параметры)
Направление = Параметры.Направление;
МассивДокументов = Параметры.МассивДокументов;
КонецПроцедуры
#КонецОбласти
#Область ОбработкаКонтента
// Обработка заполнения контента в формате приказа ММВ-7-15/820@.
//
// Параметры:
// СсылкаНаДокумент - ЛюбаяСсылка - ссылка на документ информационной базы;
// Протоконтент - Структура - http://1c-pro-docs.diadoc.ru/ru/latest/objects/Utd820SellerContent.html
//
Процедура ПримерОбработкиУПД820(СсылкаНаДокумент, Протоконтент)
// Получение значений реквизитов документа информационной базы
НужныеРеквизиты = Новый Структура;
НужныеРеквизиты.Вставить("Организация");
НужныеРеквизиты.Вставить("Контрагент");
НужныеРеквизиты.Вставить("НаименованиеПодразделения", "Подразделение.НаименованиеПолное");
ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаДокумент, НужныеРеквизиты);
// Заполнение дополнительной информации и адреса электронной почты продавца
РеквизитыПродавца = Протоконтент.Sellers[0];
РеквизитыПродавца.AdditionalInfo = ЗначенияРеквизитов.НаименованиеПодразделения;
РеквизитыПродавца.Email = "sales@domain.ru";
// Переопределение идентификатора покупателя
РеквизитыПокупателя = Протоконтент.Buyers[0];
РеквизитыПокупателя.FnsParticipantId = "Моя функция для определения идентификатора участника ЭДО";
КоллекцияСтрок = Протоконтент.Table.Items;
СвойствоСлужебнаяИнформация = ИмяСвойстваСлужебнаяИнформация();
Для Каждого Элемент Из КоллекцияСтрок Цикл
// Структура, которая содержит ссылки на данные строки табличной части документа ИБ.
СлужебнаяИнформация = Элемент[СвойствоСлужебнаяИнформация];
Номенклатура = СлужебнаяИнформация.Номенклатура;
Характеристика = СлужебнаяИнформация.Характеристика;
Упаковка = СлужебнаяИнформация.Упаковка;
// Пример для заполнения в поле КодТов штрихкодов номенклатуры документа
Элемент.ItemVendorCode = ШтрихкодНоменклатуры(Номенклатура, Характеристика, Упаковка);
// Пример получения доп. реквизита объекта.
// Здесь "ИмяДополнительногоРеквизита" - это значение реквизита "Имя" ПВХ "ДополнительныеРеквизитыИСведения"
ИдентификаторТовара = УправлениеСвойствами.ЗначениеСвойства(Номенклатура, "ИмяДополнительногоРеквизита"); // Функция БСП есть в любой типовой конфигурации
// Пример добавления в доп. сведения поля "ИД товара"
ДополнитьМассивKeyValue(Элемент.StructedAdditionalInfo
, "ИД товара"
, ИдентификаторТовара);
КонецЦикла;
КонецПроцедуры
// Обработка заполнения контента в формате приказа ММВ-7-15/155@.
//
// Параметры:
// СсылкаНаДокумент - ЛюбаяСсылка - ссылка на документ информационной базы;
// Протоконтент - Структура - https://diadocsdk-1c.readthedocs.io/ru/latest/ComObjects/UtdSellerContent.html
//
Процедура ПримерОбработкиУПД155(СсылкаНаДокумент, Протоконтент)
НужныеРеквизиты = Новый Структура;
НужныеРеквизиты.Вставить("Контрагент");
НужныеРеквизиты.Вставить("Комментарий");
ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаДокумент, НужныеРеквизиты);
// Для контрагента задано дополнительное свойство - "Адрес доставки".
// Добавим его в произвольные поля шапки документа
АдресДоставки = ЗначениеДопСвойстваПоИмени(ЗначенияРеквизитов.Контрагент, "Адрес доставки");
ДополнитьМассивKeyValue(Протоконтент.AdditionalInfoId.StructedAdditionalInfos, "Адрес доставки", Строка(АдресДоставки));
Если Протоконтент.Function = "Invoice" Тогда
// СЧФ
ИначеЕсли Протоконтент.Function = "Basic" Тогда
// ДОП
// пользователь хочет чтобы в УПД ДОП строка 5 "К платежно-расчетному документу №" заполнялась из комментария
// комментарий должен иметь вид: "№159245 от 03.10.2017"
Если Найти(ЗначенияРеквизитов.Комментарий, "№") > 0 Тогда
МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ЗначенияРеквизитов.Комментарий, " ");
Если МассивПодстрок.Количество() = 3
И Лев(МассивПодстрок[0], 1) = "№"
И МассивПодстрок[1] = "от"
И СтрДлина(МассивПодстрок[2]) = 10 Тогда
PaymentDocument = Новый Структура("Date, Number");
PaymentDocument.Date = Дата(Прав(МассивПодстрок[2], 4), Сред(МассивПодстрок[2], 4, 2), Лев(МассивПодстрок[2], 2));
PaymentDocument.Number = Прав(МассивПодстрок[0], СтрДлина(МассивПодстрок[0]) - 1);
Протоконтент.PaymentDocuments.Добавить(PaymentDocument);
КонецЕсли;
КонецЕсли;
ИначеЕсли Протоконтент.Function = "InvoiceAndBasic" Тогда
// СЧФДОП
КонецЕсли;
КонецПроцедуры
// Обработка заполнения контента накладной в формате приказа ММВ-7-6/172@.
//
// Параметры:
// СсылкаНаДокумент - ЛюбаяСсылка - ссылка на документ информационной базы;
// Протоконтент - Структура - https://diadocsdk-1c.readthedocs.io/ru/latest/ComObjects/Torg12SellerContent.html
//
Процедура ПримерОбработкиНакладной172(СсылкаНаДокумент, Протоконтент)
// пример использования обработки события
// пользователю необходимо, чтобы в ТОРГ12, который он отправляет контрагенту,
// в наименовании товара через точку с пробелом отображался основной производитель товара,
// а так же не обрезались лидирующие нули в номере накладной.
Протоконтент.Number = СсылкаНаДокумент.Номер;
Товары = СсылкаНаДокумент.Товары;
ВГраница = Протоконтент.Items.ВГраница();
Для ИндексЦикла = 0 ПО ВГраница Цикл
Item = Протоконтент.Items[ИндексЦикла];
СтрокаТовары = Товары[ИндексЦикла];
Item.Product = СтрокаТовары.Номенклатура.Наименование+". "+СокрЛП(СтрокаТовары.Номенклатура.Производитель);
КонецЦикла;
КонецПроцедуры
// Обработка заполнения контента акта выполненных работ в формате приказа ММВ-7-6/172@.
//
// Параметры:
// СсылкаНаДокумент - ЛюбаяСсылка - ссылка на документ информационной базы;
// Протоконтент - Структура - https://diadocsdk-1c.readthedocs.io/ru/latest/ComObjects/AcceptanceCertificateSellerContent.html
//
Процедура ПримерОбработкиАкта172(СсылкаНаДокумент, Протоконтент)
// какой-то код кастомизации контента
КонецПроцедуры
// Пример функции для получения штрихкода номенклатуры в УТ/КА/ERP.
// Если для выбранной комбинации номенклатуры, характеристики и упаковки
// задано несколько штрихкодов, то вернется первый попавшийся.
//
// Параметры:
// Номенклатура - СправочникСсылка.Номенклатура - номенклатура;
// Характеристика - СправочникСсылка.ХарактеристикиНоменклатуры, Неопределено - характеристика номенклатуры;
// Упаковка - СправочникСсылка.УпаковкиЕдиницыИзмерения, Неопределено - упаковка номенклатуры;
//
// Возвращаемое значение:
// Строка - штрихкод номенклатуры
//
Функция ШтрихкодНоменклатуры(Номенклатура, Знач Характеристика = Неопределено, Знач Упаковка = Неопределено)
Результат = "";
// Приведем типы
Если ТипЗнч(Характеристика) <> Тип("СправочникСсылка.ХарактеристикиНоменклатуры") Тогда
Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
Если ТипЗнч(Упаковка) <> Тип("СправочникСсылка.УпаковкиЕдиницыИзмерения") Тогда
Упаковка = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка();
КонецЕсли;
НайденныеШтрихкоды = РегистрыСведений.ШтрихкодыНоменклатуры.ШтрихкодыНоменклатуры(Номенклатура, Характеристика, Упаковка);
Если ЗначениеЗаполнено(НайденныеШтрихкоды) Тогда
Результат = НайденныеШтрихкоды[0];
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Описывает возможные значения типов протоконтента.
//
// Возвращаемое значение:
// Структура - см. тело функции.
//
Функция ТипыКонтента()
Результат = ОбработкаОбъект.ТипыКонтента();
Возврат Результат;
КонецФункции
// Функция возвращает значение дополнительного свойства объекта по имени свойства.
//
// Параметры
// Объект - <СправочникСсылка, ДокументСсылка> - Ссылка на объект в 1С, для которого задано дополнительное свойство.
// ИмяСвойства - <Строка> - Имя свойства, для которого надо вернуть значение
Функция ЗначениеДопСвойстваПоИмени(Объект, ИмяСвойства)
Результат = Неопределено;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДополнительныеСведения.Значение КАК Значение
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект = &Объект
| И ДополнительныеСведения.Свойство = &Свойство";
ПВХСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяСвойства); // При необходимости можно кэшировать
// В БСП в поле "Наименование" для элемента ПВХ добавляется расшифровка, к какому виду объектов он относится.
// Например, "Адрес доставки (Контрагенты)".
// В простых случаях достаточно НайтиПоНаименованию с неточным соотверствием (т.е. по началу наименования)
// В более сложных случаях понадобится отдельный запрос.
Запрос.УстановитьПараметр("Свойство", ПВХСсылка);
Запрос.УстановитьПараметр("Объект", Объект);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
Результат = РезультатЗапроса.Значение;
КонецЕсли;
Возврат Результат;
КонецФункции
// Процедура добавляет структурированное инфополе в контент исходящего документа
//
// Параметры
// Массив - <Массив> - Коллекция инфополей шапки или табличной части документа (http://1c-docs.diadoc.ru/ru/latest/StructedAdditionalInfo.html)
// Key - <Строка> - Ключ добавляемого свойства
// Value - <Строка> - Значение добавляемого свойства
Процедура ДополнитьМассивKeyValue(Массив, Key, Value)
НовыйЭлемент = Новый Структура;
НовыйЭлемент.Вставить("Key", Key);
НовыйЭлемент.Вставить("Value", Value);
Массив.Добавить(НовыйЭлемент);
КонецПроцедуры
// Возвращает зарезервированное имя свойства для передачи произвольных данных в структуру контента.
// Например, ссылки на источники, по которым сформирована структура контента,
// или любые иные сведения, определенные в событии ПМ "ПослеЗаполненияКонтента".
//
// Возвращаемое значение:
// Строка.
//
Функция ИмяСвойстваСлужебнаяИнформация()
Возврат МетодСервера("Модуль_ИнтеграцияУниверсальный", "ИмяСвойстваСлужебнаяИнформация");
КонецФункции
#КонецОбласти
Тестировал:
1С:Комплексная автоматизация 2 (2.4.9.98)
Платформа 1С:Предприятие 8.3 (8.3.16.1148)