#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область Проведение
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
Возврат;
КонецПроцедуры
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
Если ДопПараметры = Неопределено Тогда
ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
КонецЕсли;
Если ТипЗнч(Документ) = Тип("ДокументОбъект.Сторно") Тогда
ДокументСсылка = Документ.Ссылка;
Иначе
ДокументСсылка = Документ;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ТекстыЗапроса = Новый СписокЗначений;
Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
КонецЕсли;
ДобавитьТекстыЗапросовТаблицСторноДвижений(Запрос, ТекстыЗапроса, Регистры);
ДобавитьТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, Регистры);
ДобавитьТекстЗапросаТаблицаИсправленияДокументов(Запрос, ТекстыЗапроса, Регистры);
СторноЛокализация.ДополнитьТекстыЗапросовПроведения(Запрос, ТекстыЗапроса, Регистры);
Если РасчетСебестоимостиПовтИсп.ИспользуетсяСреднескользящаяОценка() Тогда
РасчетСебестоимостиПроведениеДокументов.ОтразитьВМеханизмеУчетаЗатратИСебестоимости(ДокументСсылка, Запрос, ТекстыЗапроса, Регистры);
КонецЕсли;
Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
КонецФункции
#КонецОбласти
#Область Команды
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
СторноЛокализация.ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры);
КонецПроцедуры
Функция ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании) Экспорт
Если ПравоДоступа("Добавление", Метаданные.Документы.Сторно) Тогда
КомандаСоздатьНаОсновании = КомандыСозданияНаОсновании.Добавить();
КомандаСоздатьНаОсновании.Менеджер = Метаданные.Документы.Сторно.ПолноеИмя();
КомандаСоздатьНаОсновании.Представление = ОбщегоНазначенияУТ.ПредставлениеОбъекта(Метаданные.Документы.Сторно);
КомандаСоздатьНаОсновании.ФункциональныеОпции = "ИспользоватьИсправлениеДокументов";
КомандаСоздатьНаОсновании.РежимЗаписи = "Проводить";
Возврат КомандаСоздатьНаОсновании;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
СторноЛокализация.ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры);
КонецПроцедуры
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
СторноЛокализация.ДобавитьКомандыПечати(КомандыПечати);
КонецПроцедуры
#КонецОбласти
#Область ДляВызоваИзДругихПодсистем
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтение
|ГДЕ
| ЧтениеОбъектаРазрешено(СторнируемыйДокумент)
|;
|РазрешитьИзменениеЕслиРазрешеноЧтение
|ГДЕ
| ИзменениеОбъектаРазрешено(СторнируемыйДокумент)";
КонецПроцедуры
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
СторноЛокализация.Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
#КонецОбласти
Функция ПараметрыПолученияИсправляемогоДокумента() Экспорт
Параметры = Новый Структура;
Параметры.Вставить("СторнируемыйДокумент", Документы.РеализацияТоваровУслуг.ПустаяСсылка());
Параметры.Вставить("Дата", Дата(1, 1, 1));
Возврат Параметры;
КонецФункции
Функция ИсправляемыйДокумент(Знач РеквизитыДокумента) Экспорт
УстановитьПривилегированныйРежим(Истина);
ИсправляемыйДокумент = Неопределено;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("СторнируемыйДокумент", РеквизитыДокумента.СторнируемыйДокумент);
Запрос.УстановитьПараметр("Период", РеквизитыДокумента.Дата);
Запрос.Текст = ТекстЗапросаТаблицаИсправленияДокументов();
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
ИсправляемыйДокумент = Выборка.ИсправляемыйДокумент;
КонецЕсли;
Возврат ИсправляемыйДокумент;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область Проведение
Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт
ИсточникиДанных = Новый Соответствие;
Возврат ИсточникиДанных;
КонецФункции
Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеДокумента.Ссылка КАК Ссылка,
| ДанныеДокумента.Дата КАК Период,
| ДанныеДокумента.Номер КАК Номер,
| ДанныеДокумента.Проведен КАК Проведен,
| ДанныеДокумента.ПометкаУдаления КАК ПометкаУдаления,
| ДанныеДокумента.СторнируемыйДокумент КАК СторнируемыйДокумент,
| ДанныеДокумента.Автор КАК Автор,
| ДанныеДокумента.Комментарий КАК Комментарий
|ИЗ
| Документ.Сторно КАК ДанныеДокумента
|ГДЕ
| ДанныеДокумента.Ссылка = &Ссылка
|";
Результат = Запрос.Выполнить();
Реквизиты = Результат.Выбрать();
Реквизиты.Следующий();
СтруктураПараметров = Новый Структура;
Для каждого Колонка Из Результат.Колонки Цикл
Запрос.УстановитьПараметр(Колонка.Имя, Реквизиты[Колонка.Имя]);
СтруктураПараметров.Вставить(Колонка.Имя, Реквизиты[Колонка.Имя]);
КонецЦикла;
РасчетСебестоимостиПрикладныеАлгоритмы.ЗаполнитьПараметрыИнициализации(Запрос, СтруктураПараметров);
КонецПроцедуры
Процедура ДобавитьТекстыЗапросовТаблицСторноДвижений(Запрос, ТекстыЗапроса, Регистры)
Если Запрос.Параметры.Свойство("СторнируемыйДокумент") Тогда
ОбъектМетаданныхДокумент = Запрос.Параметры.СторнируемыйДокумент.Метаданные();
УчетныеМеханизмы = ПроведениеДокументов.УчетныеМеханизмыДокумента(Документы[ОбъектМетаданныхДокумент.Имя]);
Иначе
ОбъектМетаданныхДокумент = Неопределено;
УчетныеМеханизмы = ПроведениеДокументов.ИменаУчетныхМеханизмовКонфигурации();
КонецЕсли;
МеханизмыКонфигурации = ПроведениеДокументов.УчетныеМеханизмыКонфигурации();
Для каждого Механизм Из УчетныеМеханизмы Цикл
МодульМеханизма = ОбщегоНазначения.ОбщийМодуль(МеханизмыКонфигурации[Механизм]);
ТекстыЗапросовСторнирования = МодульМеханизма.ТекстыЗапросовСторнирования(Метаданные.Документы.Сторно);
Для каждого КлючИЗначение Из ТекстыЗапросовСторнирования Цикл
ОбъектМетаданныхРегистр = Метаданные.НайтиПоПолномуИмени(КлючИЗначение.Ключ);
Если Не ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ОбъектМетаданныхРегистр.Имя, Регистры) Тогда
Продолжить;
КонецЕсли;
Если ОбъектМетаданныхДокумент <> Неопределено
И Не ОбъектМетаданныхДокумент.Движения.Содержит(ОбъектМетаданныхРегистр) Тогда
Продолжить;
КонецЕсли;
ТекстыЗапроса.Добавить(КлючИЗначение.Значение, ОбъектМетаданныхРегистр.Имя);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "РеестрДокументов";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат;
КонецЕсли;
ИсправляемыеДокументыПустыеСсылки = Новый Массив;
Для каждого Тип Из Метаданные.ОпределяемыеТипы.ИсправляемыеДокументы.Тип.Типы() Цикл
ИсправляемыеДокументыПустыеСсылки.Добавить(Новый (Тип));
КонецЦикла;
Запрос.УстановитьПараметр("ИсправляемыеДокументыПустыеСсылки", ИсправляемыеДокументыПустыеСсылки);
ТекстЗапроса = "ВЫБРАТЬ
| РеестрДокументов.ТипСсылки КАК ТипСсылки,
| РеестрДокументов.ХозяйственнаяОперация КАК ХозяйственнаяОперация,
| РеестрДокументов.Организация КАК Организация,
| РеестрДокументов.Партнер КАК Партнер,
| РеестрДокументов.МестоХранения КАК МестоХранения,
| РеестрДокументов.Контрагент КАК Контрагент,
| РеестрДокументов.Подразделение КАК Подразделение,
| ДанныеДокумента.Дата КАК ДатаДокументаИБ,
| ДанныеДокумента.Ссылка КАК Ссылка,
| РеестрДокументов.РазделительЗаписи КАК РазделительЗаписи,
| ДанныеДокумента.Номер КАК НомерДокументаИБ,
| РеестрДокументов.Статус КАК Статус,
| ДанныеДокумента.Автор КАК Ответственный,
| РеестрДокументов.ДополнительнаяЗапись КАК ДополнительнаяЗапись,
| РеестрДокументов.Дополнительно КАК Дополнительно,
| ДанныеДокумента.Комментарий КАК Комментарий,
| ДанныеДокумента.Проведен КАК Проведен,
| ДанныеДокумента.ПометкаУдаления КАК ПометкаУдаления,
| РеестрДокументов.ДатаПервичногоДокумента КАК ДатаПервичногоДокумента,
| РеестрДокументов.НомерПервичногоДокумента КАК НомерПервичногоДокумента,
| РеестрДокументов.Сумма КАК Сумма,
| РеестрДокументов.Валюта КАК Валюта,
| РеестрДокументов.Договор КАК Договор,
| РеестрДокументов.НаправлениеДеятельности КАК НаправлениеДеятельности,
| ДанныеДокумента.Дата КАК ДатаОтраженияВУчете,
| ИСТИНА КАК СторноИсправление,
| ДанныеДокумента.СторнируемыйДокумент КАК СторнируемыйДокумент,
| ВЫБОР
| КОГДА РеестрДокументов.ИсправляемыйДокумент = НЕОПРЕДЕЛЕНО
| ИЛИ РеестрДокументов.ИсправляемыйДокумент В (&ИсправляемыеДокументыПустыеСсылки)
| ТОГДА ДанныеДокумента.СторнируемыйДокумент
| ИНАЧЕ РеестрДокументов.ИсправляемыйДокумент
| КОНЕЦ КАК ИсправляемыйДокумент,
| ДанныеДокумента.Автор КАК Автор
|ИЗ
| Документ.Сторно КАК ДанныеДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.РеестрДокументов КАК РеестрДокументов
| ПО
| ДанныеДокумента.СторнируемыйДокумент = РеестрДокументов.Ссылка
|ГДЕ
| ДанныеДокумента.Ссылка В (&Ссылка)
|";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
КонецПроцедуры
Функция ТекстЗапросаТаблицаИсправленияДокументов()
ТекстЗапроса =
"ВЫБРАТЬ
| &СторнируемыйДокумент КАК СторнируемыйДокумент
|
|ПОМЕСТИТЬ ВТ_СторнируемыйДокумент
|;
|
|
|ВЫБРАТЬ
| &Период КАК Период,
| ЕСТЬNULL(ИсправленияДокументов.ИсправляемыйДокумент, ВТ_СторнируемыйДокумент.СторнируемыйДокумент) КАК ИсправляемыйДокумент,
| ВЫБОР
| КОГДА ИсправленияДокументов.Регистратор ЕСТЬ NULL
| ТОГДА Неопределено
| КОГДА ИсправленияДокументов.СпособИсправленияСторно
| ТОГДА ВТ_СторнируемыйДокумент.СторнируемыйДокумент
| ИНАЧЕ ИсправленияДокументов.ПредыдущееИсправление
| КОНЕЦ КАК ПредыдущееИсправление,
| ВЫБОР
| КОГДА ИсправленияДокументов.Регистратор ЕСТЬ NULL
| ТОГДА Неопределено
| КОГДА ИсправленияДокументов.СпособИсправленияСторно
| ТОГДА Неопределено
| ИНАЧЕ ИсправленияДокументов.ПредыдущееИсправление
| КОНЕЦ КАК ПоследнийДокументЦепочки,
| ВЫБОР
| КОГДА ЕСТЬNULL(ИсправленияДокументов.СпособИсправленияСторно, ИСТИНА)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК СторнированИсправляемыйДокумент,
| ИСТИНА КАК СпособИсправленияСторно
|ИЗ
| ВТ_СторнируемыйДокумент КАК ВТ_СторнируемыйДокумент
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсправленияДокументов КАК ИсправленияДокументов
| ПО (ИсправленияДокументов.Регистратор = ВТ_СторнируемыйДокумент.СторнируемыйДокумент)";
Возврат ТекстЗапроса;
КонецФункции
Процедура ДобавитьТекстЗапросаТаблицаИсправленияДокументов(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ИсправленияДокументов";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат;
КонецЕсли;
ТекстЗапроса = ТекстЗапросаТаблицаИсправленияДокументов();
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
КонецПроцедуры
#Область ПартионныйУчет
Функция ОписаниеРегистровУчетаЗатратИСебестоимости(Документ) Экспорт
ОписаниеРегистров = Новый Массив;
ОписаниеРегистров.Добавить(Метаданные.РегистрыНакопления.СебестоимостьТоваров);
Возврат ОписаниеРегистров;
КонецФункции
Функция УстановитьДополнительныеПараметрыОперацийУчетаЗатратИСебестоимости(Документ, Запрос = Неопределено) Экспорт
ДополнительныеПараметры = Новый Массив;
Если Запрос <> Неопределено Тогда
КонецЕсли;
Возврат ДополнительныеПараметры;
КонецФункции
Функция СформироватьДополнительныеТаблицыОперацийУчетаЗатратИСебестоимости(Документ, Запрос = Неопределено, ТекстыЗапроса = Неопределено) Экспорт
ДополнительныеТаблицы = Новый Массив;
Возврат ДополнительныеТаблицы;
КонецФункции
Функция ОписаниеОперацийУчетаСебестоимости(Документ) Экспорт
ОписаниеОпераций = Новый Массив;
#Область ВыбытиеПоФиксированнойСтоимости_Товар
Если РасчетСебестоимостиПовтИсп.ИспользуетсяСреднескользящаяОценка() Тогда
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 0
| ТаблицаДокумента.Дата КАК Период,
| ТаблицаДокумента.Ссылка КАК Ссылка,
| НЕОПРЕДЕЛЕНО КАК ДокументИсточник,
| НЕОПРЕДЕЛЕНО КАК ПериодДокументаИсточника,
| НЕОПРЕДЕЛЕНО КАК КорректируемыйДокумент,
|
| ТаблицаВидыЗапасов.Организация КАК Организация,
| ТаблицаВидыЗапасов.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
| ТаблицаВидыЗапасов.ВидЗапасов КАК ВидЗапасов,
| ТаблицаВидыЗапасов.ВидДеятельностиНДС КАК ВидДеятельностиНДС,
| ТаблицаВидыЗапасов.ВидДеятельностиНДС КАК ВидДеятельностиНДСДокумента,
|
| НЕОПРЕДЕЛЕНО КАК КорАналитикаУчетаНоменклатуры,
| НЕОПРЕДЕЛЕНО КАК КорВидЗапасов,
| НЕОПРЕДЕЛЕНО КАК СтатьяРасходовАктивов,
| НЕОПРЕДЕЛЕНО КАК АналитикаРасходовАктивов,
| НЕОПРЕДЕЛЕНО КАК СтатьяДоходов,
| НЕОПРЕДЕЛЕНО КАК АналитикаДоходов,
|
| НЕОПРЕДЕЛЕНО КАК Сделка,
| НЕОПРЕДЕЛЕНО КАК Подразделение,
| НЕОПРЕДЕЛЕНО КАК Менеджер,
| НЕОПРЕДЕЛЕНО КАК ГруппаПродукции,
|
| ТаблицаВидыЗапасов.Количество КАК Количество,
| ТаблицаВидыЗапасов.ИдентификаторСтроки КАК ИдентификаторСтроки,
| ТаблицаВидыЗапасов.Стоимость КАК Стоимость,
| ТаблицаВидыЗапасов.Стоимость КАК СтоимостьБезНДС,
| ТаблицаВидыЗапасов.Стоимость КАК СтоимостьРегл,
| ТаблицаВидыЗапасов.Стоимость КАК СтоимостьУпр,
| ТаблицаВидыЗапасов.Стоимость КАК КорСтоимость,
|
| ТаблицаВидыЗапасов.ХозяйственнаяОперация КАК ХозяйственнаяОперация,
| ТаблицаВидыЗапасов.ИдентификаторФинЗаписи КАК ИдентификаторФинЗаписи,
| ТаблицаВидыЗапасов.НастройкаХозяйственнойОперации КАК НастройкаХозяйственнойОперации
|
|ИЗ
| Документ.Сторно КАК ТаблицаДокумента
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.СебестоимостьТоваров КАК ТаблицаВидыЗапасов
| ПО ЛОЖЬ
|ГДЕ
| ТаблицаДокумента.Ссылка В (&Ссылка)";
РасчетСебестоимостиПроведениеДокументов.ДобавитьОписаниеОперацииДляОтраженияВУчетеСебестоимости(
ОписаниеОпераций,
Перечисления.ОперацииУчетаСебестоимости.ВыбытиеПоФиксированнойСтоимости,
ТекстЗапроса);
КонецЕсли;
#КонецОбласти
Возврат ОписаниеОпераций;
КонецФункции
#КонецОбласти
#КонецОбласти
Функция АдаптированныйТекстЗапросаДвиженийПоРегистру(ИмяРегистра) Экспорт
Запрос = Новый Запрос();
ТекстыЗапроса = Новый СписокЗначений();
ПолноеИмяДокумента = ПустаяСсылка().Метаданные().ПолноеИмя();
СинонимТаблицыДокумента = "ДанныеДокумента";
ВЗапросеЕстьИсточник = Истина;
ЗначенияПараметров = Новый Структура;
ЗначенияПараметров.Вставить("ИдентификаторМетаданных",
ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ПолноеИмяДокумента));
ПереопределениеРасчетаПараметров = Новый Структура;
Если ИмяРегистра = "РеестрДокументов" Тогда
ДобавитьТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, ИмяРегистра);
ТекстЗапроса = ТекстыЗапроса[0].Значение;
ЗначенияПараметров.Вставить("ИсправляемыеДокументыПустыеСсылки",
Запрос.Параметры.ИсправляемыеДокументыПустыеСсылки);
ВЗапросеЕстьИсточник = Истина;
Иначе
ТекстИсключения = НСтр("ru = 'В документе %ПолноеИмяДокумента% не реализована адаптация текста запроса формирования движений по регистру %ИмяРегистра%.'");
ТекстИсключения = СтрЗаменить(ТекстИсключения, "%ПолноеИмяДокумента%", ПолноеИмяДокумента);
ТекстИсключения = СтрЗаменить(ТекстИсключения, "%ИмяРегистра%", ИмяРегистра);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
Если ИмяРегистра = "РеестрДокументов" Тогда
ТекстЗапроса = ОбновлениеИнформационнойБазыУТ.АдаптироватьЗапросПроведенияПоНезависимомуРегистру(
ТекстЗапроса,
ПолноеИмяДокумента,
СинонимТаблицыДокумента,
ВЗапросеЕстьИсточник,
ПереопределениеРасчетаПараметров
);
Для Каждого Измерение Из Метаданные.РегистрыСведений.РеестрДокументов.Измерения Цикл
Если Измерение.Тип.СодержитТип(Тип("СправочникСсылка.КлючиРеестраДокументов")) Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 КАК %1", Измерение.Имя),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.Ключ КАК %1", Измерение.Имя)
);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Результат = ОбновлениеИнформационнойБазыУТ.РезультатАдаптацииЗапроса();
Результат.ЗначенияПараметров = ЗначенияПараметров;
Результат.ТекстЗапроса = ТекстЗапроса;
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецЕсли