Имя: Пароль:
1C
1С v8
Имитация действий пользователя
0 Gray776
 
27.03.14
11:06
В общем после загрузки реализации из одной базы в другую, Не проставляются счета учета у товаров, причина: в источнике не ведется бухгалтерский учет. Там просто нет, в источнике, этих счетов. Если зайти в документ и перевыбрать договор контрагента то, встают все реквизиты на место. Вот и думаю можно ли как то программно это проделывать при загрузке.
1 VikingKosmo
 
27.03.14
11:09
Разрешаю.
2 vde69
 
модератор
27.03.14
11:09
обработчик "после загрузки"

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

    СтрокаТоваров.Субконто = Параметры.СубконтоТовар;
    Если ЗначениеЗаполнено(СтрокаТоваров.СчетДоходов) И СвойстваСчетаДоходов.КоличествоСубконто > 0 Тогда
        СтрокаТоваров.Субконто = СвойстваСчетаДоходов.ВидСубконто1ТипЗначения.ПривестиЗначение(СтрокаТоваров.Субконто);
        Если ТипЗнч(СтрокаТоваров.Субконто) = Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
            СтрокаТоваров.Субконто = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТоваров.Номенклатура, "НоменклатурнаяГруппа");
        КонецЕсли;
    Иначе
        СтрокаТоваров.Субконто = Неопределено;
    КонецЕсли;
    СтрокаТоваров.Субконто = Параметры.СубконтоТовар;
КонецЦикла;

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

Объект.СуммаДокумента = Объект.Товары.Итог("Сумма");

Если не ОбъектНайден Тогда
    Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;

Если не Объект.ПометкаУдаления
    и не Объект.Проведен
    И ЗначениеЗаполнено(ПараметрыОбъекта["НомерСФ"])
    И ЗначениеЗаполнено(ПараметрыОбъекта["ДатаСФ"]) Тогда
    
    мСФ = Новый Структура("Основание,     Дата,                       Номер,                               ОснованиеПеч",
                           Объект.Ссылка, ПараметрыОбъекта["ДатаСФ"], СокрЛП(ПараметрыОбъекта["НомерСФ"]), СокрЛП(ПараметрыОбъекта["ОснованиеПеч"]));
    Параметры.МассивСФ.Добавить(мСФ);
    
КонецЕсли;
3 vde69
 
модератор
27.03.14
11:11
обработчик глобальный "после загрузки данных"

мМассивСФ = Неопределено;
Если Параметры.Свойство("МассивСФ", мМассивСФ) Тогда
    Для каждого эл из мМассивСФ Цикл    
        СчетФактура = УчетНДСПереопределяемый.НайтиПодчиненныйСчетФактуруВыданныйНаРеализацию(эл.Основание);
        Если СчетФактура = Неопределено Тогда
            СчетФактура = Документы.СчетФактураВыданный.СоздатьДокумент();
            СчетФактура.Заполнить(эл.Основание);
        Иначе
            СчетФактура = СчетФактура.ПолучитьОбъект();
        КонецЕсли;
        
        Если не СчетФактура.Проведен Тогда
            СчетФактура.Дата = эл.Дата;
            СчетФактура.Номер = эл.Номер;
            СчетФактура.ПлатежноРасчетныеДокументы.Очистить();
            Попытка
                мТЗ = ЗначениеИзСтрокиВнутр(эл.ОснованиеПеч);
                Для каждого мЭл из мТЗ Цикл
                    НоваяСтрока = СчетФактура.ПлатежноРасчетныеДокументы.Добавить();
                    НоваяСтрока.ДатаДокумента = мЭл.Дата;
                    НоваяСтрока.НомерДокумента = мЭл.Номер;
                КонецЦикла
            Исключение
            КонецПопытки;
            
            Попытка
                СчетФактура.Записать(РежимЗаписиДокумента.Запись);
            Исключение
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;
4 Gray776
 
27.03.14
11:11
(2) та вот я как раз и на этом остановился либо проставлять у товаров счета и все такое либо перевыбрать договор контрагента
5 vde69
 
модератор
27.03.14
11:12
у меня все работает :)
6 Gray776
 
27.03.14
11:14
(3) (2) спасибо конечно мне теперь прикрутить это просто к конвертации и все тоже по тходу заработает.
Но блин интересно насчет просто заставить перевыбрать договор контрагента... Надо посмотреть код в 1с чего там при выборе договора делается может просто функцию али процедуру какую запустить...
7 Vladuha
 
27.03.14
11:54
(6) ты сам практически ответил на свой вопрос :) Посмотри, что происходит в коде при изменении договора и добавь такой код в обработчик после загрузки объекта
8 х86
 
27.03.14
12:11
емнип в типовых есть процедурина запонитьсчетаучетачегототам
9 Gray776
 
27.03.14
15:11
(7) ничего хорошего там не происходит.

&НаКлиенте
Процедура ДоговорКонтрагентаПриИзменении(Элемент)

    Если ЗначениеЗаполнено(Объект.ДоговорКонтрагента) Тогда
        ДоговорКонтрагентаПриИзмененииНаСервере();
    КонецЕсли;

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

&НаСервере
Процедура ДоговорКонтрагентаПриИзмененииНаСервере()
    
    РеализацияТоваровУслугФормы.ДоговорКонтрагентаПриИзменении(ЭтаФорма);
    
КонецПроцедуры

(8) БП 3.0.
// Функция выполняет общие действия при изменении договора взаиморасчетов
//
// Параметры:
//  ДокументОбъект - объект редактируемого документа,
//  СпособЗаполненияЦен          - значение перечисления "Способы заполнения цен", определяет по какому из
//                                   регистров ("Цены номенклатуры" или "Цены номенклатуры контрагентов") будет строиться запрос;
//  СтараяВалютаВзаиморасчетов   - ссылка на справочник валют, определяет валюту взаиморасчетов
//                                 до изменения договора;
//  ВалютаРегламентированногоУчета - валюта регламентированного учета
//  СтруктураРеквизитовДокумента - структура, задает список обрабатываемых реквизитов документа;
//                                    если реквизит надо обрабатывать, то для него есть ключ в этой структуре
//  ТипОперации                  - необязаетельный, строка вида операции ("Покупка" или "Продажа");
//                                 если не передан, то реквизиты, зависящие от вида операции, не заполняются
//  ИмяТабличнойЧасти             - имя табличной части
//  СтарыйДоговорКонтрагента  - старый договор контрагента, который был до изменения
//  СтруктураЗначений             - структура, в эту переменную возвращаются значения элементов диалога выбора валюты.
//
Функция ПриИзмененииЗначенияДоговора(ДокументОбъект, СтараяВалютаВзаиморасчетов, ВалютаРегламентированногоУчета,
                                 СпособЗаполненияЦен, СтруктураРеквизитовДокумента, ТипОперации = "", ИмяТабличнойЧасти,
                                 СтарыйДоговорКонтрагента = Неопределено,
                                 СтруктураЗначений = Неопределено) Экспорт

    Перем Договор, ТипЦенВДоговоре;

    ПараметрыОбработки = Новый Структура();
    ПараметрыОбработки.Вставить("ЗаполнитьЦены",        Ложь);
    ПараметрыОбработки.Вставить("ПересчитатьЦены",        Ложь);
    ПараметрыОбработки.Вставить("ОбновитьЦенаИВалюта",    Ложь);
    ПараметрыОбработки.Вставить("ТекстВопроса",            "");
    ПараметрыОбработки.Вставить("ПредыдущаяВалюта",        ДокументОбъект.ВалютаДокумента);

    МетаданныеДокумента = ДокументОбъект.Ссылка.Метаданные();
    Договор = ДокументОбъект.ДоговорКонтрагента;

    Если НЕ ЗначениеЗаполнено(Договор) Тогда
        СтруктураКурсаДокумента = РаботаСКурсамиВалют.ПолучитьКурсВалюты(ВалютаРегламентированногоУчета, ДокументОбъект.Дата);

        Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("КурсВзаиморасчетов", МетаданныеДокумента) Тогда
            ДокументОбъект.КурсВзаиморасчетов      = СтруктураКурсаДокумента.Курс;
        КонецЕсли;

        Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("КратностьВзаиморасчетов", МетаданныеДокумента) Тогда
            ДокументОбъект.КратностьВзаиморасчетов = СтруктураКурсаДокумента.Кратность;
        КонецЕсли;

        Возврат ПараметрыОбработки;

    Иначе

        // Если СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатурыКонтрагентов
        // и договоров взаиморасчетов имеет тип не договор поставщика, то это неправильно и надо вернуть старый договор
        // Аналогично если СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры
        // и договоров взаиморасчетов имеет тип не договор покупателя
        ИмяРеквизитаВидДоговора = БухгалтерскийУчетКлиентСерверПереопределяемый.ПолучитьИмяРеквизитаВидДоговора();
        ЗначениеВидаДоговора = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Договор, ИмяРеквизитаВидДоговора);
        
        Если (СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатурыКонтрагентов
             И НЕ БухгалтерскийУчетПереопределяемый.ЭтоВидДоговораСПоставщиком(ЗначениеВидаДоговора)
             И НЕ БухгалтерскийУчетПереопределяемый.ЭтоВидДоговораСКомитентом(ЗначениеВидаДоговора))
         Или (СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры
             И НЕ БухгалтерскийУчетПереопределяемый.ЭтоВидДоговораСПокупателем(ЗначениеВидаДоговора)
             И НЕ БухгалтерскийУчетПереопределяемый.ЭтоВидДоговораСКомиссионером(ЗначениеВидаДоговора)) Тогда

            ТекстПредупреждения = "В документе можно выбирать только договоры с "
                                + ?(СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры, "покупателями или с комиссионерами", "поставщиками или комитентами")+"!"+Символы.ПС;
            Если ЗначениеЗаполнено(СтарыйДоговорКонтрагента)
               И СтарыйДоговорКонтрагента.Владелец = ДокументОбъект.Контрагент Тогда
                ТекстПредупреждения = ТекстПредупреждения + "Будет восстановлен старый договор.";
                ДокументОбъект.ДоговорКонтрагента = СтарыйДоговорКонтрагента;
            Иначе
                ТекстПредупреждения = ТекстПредупреждения + "Договор будет очищен.";
                ДокументОбъект.ДоговорКонтрагента = Неопределено;
            КонецЕсли;
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстПредупреждения);
            // дальше ничего пересчитывать не надо
            Возврат ПараметрыОбработки;

        КонецЕсли;

    КонецЕсли;

    Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("Сделка", МетаданныеДокумента)
        И НЕ ТипЗнч(ДокументОбъект.Сделка) = Тип("ДокументСсылка.ОтчетОРозничныхПродажах") Тогда

        ДокументОбъект.Сделка = Неопределено;

    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(ДокументОбъект.Контрагент) Тогда

        ДокументОбъект.Контрагент = Договор.Владелец;

    ИначеЕсли ЗначениеЗаполнено(Договор)
            И ДокументОбъект.Контрагент <> Договор.Владелец Тогда //Владелец нового договора должен совпадать с контрагентом документа.

            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выбранный договор принадлежит другому контрагенту.
                           |Будет восстановлен старый договор.");
            Договор = СтарыйДоговорКонтрагента;

    КонецЕсли;

    //Владелец нового договора должен совпадать с контрагентом документа.

    Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("Организация", МетаданныеДокумента)
         И НЕ ЗначениеЗаполнено(ДокументОбъект.Организация) Тогда
        ДокументОбъект.Организация = Договор.Организация;
    КонецЕсли;

    // если хоть в одной табличной части есть хотя бы одна строка, надо пересчитывать
    НадоПересчитывать = Ложь;
    Для каждого ТЧОбъекта Из МетаданныеДокумента.ТабличныеЧасти Цикл
        Если ДокументОбъект[ТЧОбъекта.Имя].Количество() > 0 Тогда
            НадоПересчитывать = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Если НадоПересчитывать = Ложь Тогда

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

            // В некоторых документах курс и кратность документа отсутствуют.
            Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("КурсДокумента", МетаданныеДокумента) Тогда
                ДокументОбъект.КурсДокумента           = СтруктураКурсаДокумента.Курс;
            КонецЕсли;
            Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("КратностьДокумента", МетаданныеДокумента) Тогда
                ДокументОбъект.КратностьДокумента      = СтруктураКурсаДокумента.Кратность;
            КонецЕсли;
            Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("КурсВзаиморасчетов", МетаданныеДокумента) Тогда
                ДокументОбъект.КурсВзаиморасчетов      = СтруктураКурсаДокумента.Курс;
            КонецЕсли;
            Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("КратностьВзаиморасчетов", МетаданныеДокумента) Тогда
                ДокументОбъект.КратностьВзаиморасчетов = СтруктураКурсаДокумента.Кратность;
            КонецЕсли;
        КонецЕсли;

        Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("ТипЦен", МетаданныеДокумента) Тогда
            Если ЗначениеЗаполнено(Договор.ТипЦен) Тогда
                ДокументОбъект.ТипЦен = Договор.ТипЦен;
                Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("СуммаВключаетНДС", МетаданныеДокумента) Тогда
                    ДокументОбъект.СуммаВключаетНДС= Договор.ТипЦен.ЦенаВключаетНДС;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;

    Иначе // ДокументОбъект.[ИмяТабличнойЧасти].Количество() > 0

        // Если заполнен и по другим параметрам, то предварительно спрашиваем
        НеобходимоПересчитать = Ложь;
        ТекстВопроса = "Договор с контрагентом предусматривает параметры взаиморасчетов,
            |отличные от установленных в документе:";

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

            Если  ДокументОбъект.ВалютаДокумента <> НовыйВалютаДокумента Тогда
                НеобходимоПересчитать                     = Истина;
                ПараметрыОбработки.ЗаполнитьЦены         = Истина;

                ТекстВопроса = ТекстВопроса + Символы.ПС +
                                 "Валюта документа: """ +
                                ?(НЕ ЗначениеЗаполнено(ДокументОбъект.ВалютаДокумента), "Не задана",СокрЛП(ДокументОбъект.ВалютаДокумента)) +
                                  """, договора: """ +  СокрЛП(НовыйВалютаДокумента) + """.";
            КонецЕсли;
        КонецЕсли;

        // Тип цен
        НадоПередаватьНовыйТипЦен = Ложь;
        Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("ТипЦен", МетаданныеДокумента) Тогда
            НовыйТипЦен = ДокументОбъект.ТипЦен;
            Если ЗначениеЗаполнено(Договор.ТипЦен) Тогда
                НовыйТипЦен = Договор.ТипЦен;
            КонецЕсли;

            Если ДокументОбъект.ТипЦен <> НовыйТипЦен Тогда
                НеобходимоПересчитать = Истина;
                НадоПередаватьНовыйТипЦен = Истина;
                ПараметрыОбработки.ЗаполнитьЦены         = Истина;
                ПараметрыОбработки.ОбновитьЦенаИВалюта    = Истина;
                ТекстВопроса = ТекстВопроса + Символы.ПС +
                                 "Тип цен документа: """ +
                                 ?(НЕ ЗначениеЗаполнено(ДокументОбъект.ТипЦен), "Не задан",СокрЛП(ДокументОбъект.ТипЦен)) +
                                   """, договора: """ + СокрЛП(НовыйТипЦен) + """.";
            КонецЕсли;
        КонецЕсли;

        Если НеобходимоПересчитать Тогда
            ПараметрыОбработки.ТекстВопроса    = ТекстВопроса + Символы.ПС + "Пересчитать документ в соответствии с договором?";
        Иначе

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

        КонецЕсли;

    КонецЕсли; // ДокументОбъект.[ИмяТЧ].Количество() = 0

    // если валюта документа после выбора договора не совпадала с валютой договора или с регламентированной,
    // очистим договор
    Если ОбщегоНазначенияБП.ЕстьРеквизитДокумента("ВалютаДокумента", МетаданныеДокумента) Тогда

        Если ДокументОбъект.ВалютаДокумента <> ВалютаРегламентированногоУчета
           И ДокументОбъект.ВалютаДокумента <> ДокументОбъект.ДоговорКонтрагента.ВалютаВзаиморасчетов Тогда

            ТекстПредупреждения = "Валюта документа не совпадает ни с валютой договора, ни с валютой регламентированного учета!"+Символы.ПС;
            Если ЗначениеЗаполнено(СтарыйДоговорКонтрагента)
               И СтарыйДоговорКонтрагента.Владелец = ДокументОбъект.Контрагент Тогда
                ТекстПредупреждения = ТекстПредупреждения + "Будет восстановлен старый договор.";
                ДокументОбъект.ДоговорКонтрагента = СтарыйДоговорКонтрагента;
            Иначе
                ТекстПредупреждения = ТекстПредупреждения + "Договор будет очищен.";
                ДокументОбъект.ДоговорКонтрагента = Неопределено;
            КонецЕсли;

            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстПредупреждения);
            // дальше ничего пересчитывать не надо
            Возврат ПараметрыОбработки;

        КонецЕсли;

    КонецЕсли;

    Возврат ПараметрыОбработки;

КонецФункции // ПриИзмененииЗначенияДоговора()


ЭТО?
10 Йохохо
 
27.03.14
15:15
(9) мало написал, там еще есть)
11 Gray776
 
27.03.14
15:16
(10) криво написал не сворачивается как код :(
12 Gray776
 
28.03.14
11:50
(2) СтрокаТоваров.Субконто = Параметры.СубконтоТовар;
А вот про эту строчку можно поподробнее?
Что за параметр "СубконтоТовар"?
Заколебался я вчера изобретать как перевыбрать договор. Пробую прикрутить то что в (2).
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс