8.х Подскажите насчет ПП в БП 1.6 (ПЛАТФОРМА 8.1)

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем sapravka, 14 сен 2012.

  1. TopicStarter Overlay
    sapravka
    Offline

    sapravka Опытный в 1С

    Регистрация:
    24 дек 2011
    Сообщения:
    142
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте!
    (ЕСЛИ НАПИСАЛ НЕ В ТОТ РАЗДЕЛ – ПРОШУ СИЛЬНО НЕ РУГАТЬ!!!)
    Подскажите насчет ПП в БП 1.6:
    А именно – необходимо убрать в назначение платежа сумму платежа, то есть что бы сумма платежа вообще там не стояла, а то получается когда вводишь сумму в платежке, данная сумма автоматический отображается в назначении платежа...
    Может быть это можно сделать как то в программе?
    Я искал, но так и не нашел...
    И залез в конфигуратор, нашел:

    Код:
    Процедура СформироватьНазначениеПлатежа(ТолькоСумму = Ложь)
    
    Если ВидОперации = Перечисления.ВидыОперацийППИсходящее.ПеречислениеНалога Тогда
    
    Если НЕ ТолькоСумму Тогда
    НазначениеПлатежа = СчетКонтрагента.ТекстНазначения;
    КонецЕсли;
    Возврат;
    
    КонецЕсли;
    
    Если НЕ ТолькоСумму Тогда
    
    Если НЕ СчетКонтрагента.Пустая() И ЗначениеЗаполнено(СчетКонтрагента.ТекстНазначения) Тогда
    
    ТекстНазначение = СчетКонтрагента.ТекстНазначения;
    
    Иначе
    
    МассивДоговоров = Новый Массив;
    Для каждого СтрокаРасшифровки Из РасшифровкаПлатежа Цикл
    Если ЗначениеЗаполнено(СтрокаРасшифровки.ДоговорКонтрагента) И МассивДоговоров.Найти(СтрокаРасшифровки.ДоговорКонтрагента) = Неопределено Тогда
    МассивДоговоров.Добавить(СтрокаРасшифровки.ДоговорКонтрагента);
    КонецЕсли;
    КонецЦикла;
    
    Если ВидОперации = Перечисления.ВидыОперацийППИсходящее.ВозвратДенежныхСредствПокупателю Тогда
    ТекстОплата = "Возврат оплаты ";
    Иначе
    ТекстОплата = "Оплата ";
    КонецЕсли;
    Если МассивДоговоров.Количество() = 0 Тогда
    ТекстНазначение = ТекстОплата + "по договору ";
    ИначеЕсли МассивДоговоров.Количество() = 1 Тогда
    ТекстНазначение = ТекстОплата + "по договору " + МассивДоговоров[0];
    Иначе
    ТекстНазначение = ТекстОплата + "по договорам: ";
    Для каждого ЭлементМассива Из МассивДоговоров Цикл
    ТекстНазначение = ТекстНазначение + ЭлементМассива + ", ";
    КонецЦикла;
    ТекстНазначение = Лев(ТекстНазначение, СтрДлина(ТекстНазначение) - 2);
    КонецЕсли;
    
    КонецЕсли;
    
    Иначе
    
    ПозицияСуммы = Найти(НазначениеПлатежа, "Сумма ");
    Если ПозицияСуммы = 0 Тогда
    ТекстНазначение = НазначениеПлатежа;
    Иначе
    ТекстНазначение = Лев(НазначениеПлатежа, ПозицияСуммы - 1);
    КонецЕсли;
    Если Прав(ТекстНазначение, 1) = Символы.ПС Тогда
    ТекстНазначение = Лев(ТекстНазначение, СтрДлина(ТекстНазначение) - 1);
    КонецЕсли;
    
    КонецЕсли;
    
    ТекстСумма = "Сумма " + Формат(СуммаДокумента, "ЧЦ=15; ЧДЦ=2; ЧРД=-; ЧН=0-00; ЧГ=");
    
    ТекстНДС = "";
    
    ТабНДС = РасшифровкаПлатежа.Выгрузить();
    ТабНДС.Свернуть("СтавкаНДС","СуммаНДС");
    
    Для Каждого СтрокаНДС ИЗ ТабНДС цикл
    ТекстНДС = ТекстНДС + ?(ПустаяСтрока(ТекстНДС), "", ", ");
    Если НЕ ЗначениеЗаполнено(СтрокаНДС.СтавкаНДС) ИЛИ СтрокаНДС.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
    ТекстНДС = ТекстНДС + "Без налога (НДС)";
    Иначе
    ТекстНДС = ТекстНДС + "НДС(" + СтрокаНДС.СтавкаНДС + ") " + Формат(СтрокаНДС.СуммаНДС, "ЧЦ=15; ЧДЦ=2; ЧРД=-; ЧН=0-00; ЧГ=");
    КонецЕсли;
    
    КонецЦикла;
    
    //Вторая строчка (после НазначениеПлатежа = ТекстНазначение + Символы.ПС)  такая:
    
    //+ ТекстСумма + Символы.ПС
    
    // закоментированная мною
    НазначениеПлатежа = ТекстНазначение + Символы.ПС
    //+ ТекстСумма + Символы.ПС
    + ?(ТабНДС.Итог("СуммаНДС") > 0, "В т.ч. ", "") + ТекстНДС;
    
    КонецПроцедуры // СформироватьНазначениеПлатежа()


    И там закомментировал строчку (//+ ТекстСумма + Символы.ПС):

    Код:
    НазначениеПлатежа = ТекстНазначение + Символы.ПС
    //+ ТекстСумма + Символы.ПС
    + ?(ТабНДС.Итог("СуммаНДС") > 0, "В т.ч. ", "") + ТекстНДС;
    
    но теперь получается, что когда вводишь сумму повторно вводиться
    Без налога (НДС) или сумма НДС – короче в зависимости от того, что выбрано в ставке НДС и если редактируешь, то есть сколько раз добавляешь/меняешь/изменяешь сумму – столько раз добавляется надпись Без налога (НДС) (или ставка НДС - в зависимости от того, что выбрано в ставке НДС) старые строчки не удаляются, а добавляются – подскажите пожалуйста :
    Как убрать дублирование (добавление) этих строк?
  2. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Третью строчку тоже попробуйте закоментировать.
    Оставьте только

    Код:
    НазначениеПлатежа = ТекстНазначение;
  3. TopicStarter Overlay
    sapravka
    Offline

    sapravka Опытный в 1С

    Регистрация:
    24 дек 2011
    Сообщения:
    142
    Симпатии:
    0
    Баллы:
    26
    Ну тогда не указывается в назначении платежа НДС - то есть:
    Без налога (НДС) или ставка НДС...
  4. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Т.е. Вам надо, чтобы сумма документа не выходила, а сумма НДС выходила ???
  5. TopicStarter Overlay
    sapravka
    Offline

    sapravka Опытный в 1С

    Регистрация:
    24 дек 2011
    Сообщения:
    142
    Симпатии:
    0
    Баллы:
    26
    Да...
    Совершенно верно!
    Подскажите пожалуйста, как это реализовать!
  6. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Там немного сложнее, чем кажется :)

    После этих строк:
    Код:
      ПозицияСуммы = Найти(НазначениеПлатежа, "Сумма ");
    Если ПозицияСуммы = 0 Тогда
    ТекстНазначение = НазначениеПлатежа;
    Иначе
    ТекстНазначение = Лев(НазначениеПлатежа, ПозицияСуммы - 1);
    КонецЕсли;
    
    добавьте:
    Код:
      //************
    ПозицияНДС = Найти(ТекстНазначение, "В т.ч. НДС");
    Если ПозицияНДС = 0 Тогда
    ПозицияНДС = Найти(ТекстНазначение, "Без налога (НДС)");
    Если ПозицияНДС <> 0 Тогда
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    Иначе
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    //************
    
    и желательно эту строку:
    Код:
    Если НЕ ЗначениеЗаполнено(СтрокаНДС.СтавкаНДС) ИЛИ СтрокаНДС.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
    изменить на:
    Код:
    Если НЕ ЗначениеЗаполнено(СтрокаНДС.СтавкаНДС) ИЛИ СтрокаНДС.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС ИЛИ СтрокаНДС.СтавкаНДС = Перечисления.СтавкиНДС.НДС0 Тогда
  7. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    С этим
    Код:
    Если НЕ ЗначениеЗаполнено(СтрокаНДС.СтавкаНДС) ИЛИ СтрокаНДС.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС ИЛИ СтрокаНДС.СтавкаНДС = Перечисления.СтавкиНДС.НДС0 Тогда
    я погорячился.
    Не надо так делать :) Оставьте как есть.
    "Без НДС" и "НДС 0 %" - не одно и то же.))

    Лучше тот код, который я привел, написать чуть-чуть по-другому.
    Вот так:
    Код:
      //************
    ПозицияНДС = Найти(ТекстНазначение, "В т.ч. НДС");
    Если ПозицияНДС = 0 Тогда
    ПозицияНДС = Найти(ТекстНазначение, "Без налога (НДС)");
    Если ПозицияНДС = 0 Тогда
    ПозицияНДС = Найти(ТекстНазначение, "НДС(0%)");
    Если ПозицияНДС <> 0 Тогда
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    Иначе
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    Иначе
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    //************
    
  8. TopicStarter Overlay
    sapravka
    Offline

    sapravka Опытный в 1С

    Регистрация:
    24 дек 2011
    Сообщения:
    142
    Симпатии:
    0
    Баллы:
    26
    Спасибо - все заработало!!!
    Вот полный код Процедура СформироватьНазначениеПлатежа:

    Код:
    // Процедура выполняет необходимые действия формирования текста назначения платежа
    //
    Процедура СформироватьНазначениеПлатежа(ТолькоСумму = Ложь)
    
    Если ВидОперации = Перечисления.ВидыОперацийППИсходящее.ПеречислениеНалога Тогда
    
    Если НЕ ТолькоСумму Тогда
    НазначениеПлатежа = СчетКонтрагента.ТекстНазначения;
    КонецЕсли;
    Возврат;
    
    КонецЕсли;
    
    Если НЕ ТолькоСумму Тогда
    
    Если НЕ СчетКонтрагента.Пустая() И ЗначениеЗаполнено(СчетКонтрагента.ТекстНазначения) Тогда
    
    ТекстНазначение = СчетКонтрагента.ТекстНазначения;
    
    Иначе
    
    МассивДоговоров = Новый Массив;
    Для каждого СтрокаРасшифровки Из РасшифровкаПлатежа Цикл
    Если ЗначениеЗаполнено(СтрокаРасшифровки.ДоговорКонтрагента) И МассивДоговоров.Найти(СтрокаРасшифровки.ДоговорКонтрагента) = Неопределено Тогда
    МассивДоговоров.Добавить(СтрокаРасшифровки.ДоговорКонтрагента);
    КонецЕсли;
    КонецЦикла;
    
    Если ВидОперации = Перечисления.ВидыОперацийППИсходящее.ВозвратДенежныхСредствПокупателю Тогда
    ТекстОплата = "Возврат оплаты ";
    Иначе
    ТекстОплата = "Оплата ";
    КонецЕсли;
    Если МассивДоговоров.Количество() = 0 Тогда
    ТекстНазначение = ТекстОплата + "по договору ";
    ИначеЕсли МассивДоговоров.Количество() = 1 Тогда
    ТекстНазначение = ТекстОплата + "по договору " + МассивДоговоров[0];
    Иначе
    ТекстНазначение = ТекстОплата + "по договорам: ";
    Для каждого ЭлементМассива Из МассивДоговоров Цикл
    ТекстНазначение = ТекстНазначение + ЭлементМассива + ", ";
    КонецЦикла;
    ТекстНазначение = Лев(ТекстНазначение, СтрДлина(ТекстНазначение) - 2);
    КонецЕсли;
    
    КонецЕсли;
    
    Иначе
    
    ПозицияСуммы = Найти(НазначениеПлатежа, "Сумма ");
    Если ПозицияСуммы = 0 Тогда
    ТекстНазначение = НазначениеПлатежа;
    Иначе
    ТекстНазначение = Лев(НазначениеПлатежа, ПозицияСуммы - 1);
    КонецЕсли;
    //************НачалоДобавленного
    ПозицияНДС = Найти(ТекстНазначение, "В т.ч. НДС");
    Если ПозицияНДС = 0 Тогда
    ПозицияНДС = Найти(ТекстНазначение, "Без налога (НДС)");
    Если ПозицияНДС = 0 Тогда
    ПозицияНДС = Найти(ТекстНазначение, "НДС(0%)");
    Если ПозицияНДС <> 0 Тогда
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    Иначе
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    Иначе
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    //************КонецДобавленного
    Если Прав(ТекстНазначение, 1) = Символы.ПС Тогда
    ТекстНазначение = Лев(ТекстНазначение, СтрДлина(ТекстНазначение) - 1);
    КонецЕсли;
    
    КонецЕсли;
    
    ТекстСумма = "Сумма " + Формат(СуммаДокумента, "ЧЦ=15; ЧДЦ=2; ЧРД=-; ЧН=0-00; ЧГ=");
    
    ТекстНДС = "";
    
    ТабНДС = РасшифровкаПлатежа.Выгрузить();
    ТабНДС.Свернуть("СтавкаНДС","СуммаНДС");
    
    Для Каждого СтрокаНДС ИЗ ТабНДС цикл
    ТекстНДС = ТекстНДС + ?(ПустаяСтрока(ТекстНДС), "", ", ");
    Если НЕ ЗначениеЗаполнено(СтрокаНДС.СтавкаНДС) ИЛИ СтрокаНДС.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
    ТекстНДС = ТекстНДС + "Без налога (НДС)";
    Иначе
    ТекстНДС = ТекстНДС + "НДС(" + СтрокаНДС.СтавкаНДС + ") " + Формат(СтрокаНДС.СуммаНДС, "ЧЦ=15; ЧДЦ=2; ЧРД=-; ЧН=0-00; ЧГ=");
    КонецЕсли;
    
    КонецЦикла;
    
    //Исходник:
    //НазначениеПлатежа = ТекстНазначение + Символы.ПС
    //	 + ТекстСумма + Символы.ПС
    //	 + ?(ТабНДС.Итог("СуммаНДС") > 0, "В т.ч. ", "") + ТекстНДС;
    
    НазначениеПлатежа = ТекстНазначение + Символы.ПС
    //+ ТекстСумма + Символы.ПС
    + ?(ТабНДС.Итог("СуммаНДС") > 0, "В т.ч. ", "") + ТекстНДС;
    
    КонецПроцедуры // СформироватьНазначениеПлатежа()
    
    Единственно, осталось только проверить насчет выгрузки клиент-банка, но это раньше понедельника сделать будет невозможно,
    хотя по смыслу - что написано в назначении платежа, то в принципе и будет (должно) выгружаться в клиент банк!!!

    И последнее - можно немного мне разжевать, по строчкам Вашего кода(я только начиная разбираться в 1с):
    1. Общее - где вы увидели, что именно надо написать
    2. Что обозначает, вернее хоть в двух словах объяснить вот эту конструкцию выбора:
    Код:
    ПозицияНДС = Найти(ТекстНазначение, "В т.ч. НДС");
    Если ПозицияНДС = 0 Тогда
    ПозицияНДС = Найти(ТекстНазначение, "Без налога (НДС)");
    Если ПозицияНДС = 0 Тогда
    ПозицияНДС = Найти(ТекстНазначение, "НДС(0%)");
    Там в двух местах выбор:
    Если ПозицияНДС = 0
    и как она определяет в какую ей ставить строчку (Без налога (НДС) или НДС(0%))?
    3. И в конце тоже в двух местах такое же:
    Код:
    Иначе
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    КонецЕсли;
    Иначе
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    
    Если Вам не сложно - расскажите пожалуйста...
  9. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Не сложно.

    Во-первых, тут всё по аналогии с суммой (чуть выше добавленного фрагмента).
    Во-вторых, прошелся отладчиком, посмотрел, как изменяется текст назначения платежа.

    Найдите в Синтакс-Помощнике (Общее описание встроенного языка - Встроенные функции - Функции работы со значениями типа Строка) функцию "Найти".
    В двух словах: эта функция ищет в указанной строке указанную подстроку. Если находит, то возвращает номер символа, с которого начинается подстрока. Если не находит, то возвращает 0 (ноль).

    В нашем случае нам надо найти в тексте назначения платежа информацию об НДС. И если найдем, то убрать. Т.к. ниже по коду текст НДС формируется снова и добавляется к имеющейся строке (поэтому ранее у Вас каждый раз добавлялась строка про НДС).
    Вот, а информация об НДС может быть представлена по-разному, в зависимости от ставки: "В т.ч. НДС...", "Без налога (НДС)" или "НДС(0%)".
    Поэтому мы и ищем в строке "ТекстНазначения" подстроку "В т.ч. НДС...". Если не находим, то ищем подстроку "Без налога (НДС)". Если не находим, то ищем "НДС(0%)". Если и ее не находим, значит в тексте назначения платежа нет информации об НДС. Тогда мы ничего не делаем (оставляем текст как есть...ниже просто добавится текст про НДС).
    А вот если что-то нашлось, тогда (чтобы не оказалось два раза) эту имеющуюся информацию про НДС мы убираем. Точнее не включаем в текст то, что находится дальше найденной подстроки, т.е. дальше полученной позиции символа.

    А как убираем?
    Используя функцию "Лев", которая и идет по ветке "Иначе".
    Это как раз Ваш третий вопрос.

    Функцию "Лев" тоже посмотрите в СП.
    В двух словах: она берет указанную строку и оставляет в ней указанное количество символов слева. Все остальное (то, что правее) удаляет.
    В нашем случае все то, что правее найденной позиции текста про НДС, удаляется. Т.е. удаляется текст, начиная со слов "В т.ч. НДС" (или "Без налога (НДС)" или "НДС(0%)") и до конца текста.

    Наверное, Вас интересует почему эта строка три раза.
    Код:
    ТекстНазначение = Лев(ТекстНазначение, ПозицияНДС - 1);
    Они соответствуют разным веткам условия.
    Одна относится к условию, если найдена строка "В т.ч. НДС", вторая - если найдена строка "Без налога (НДС)", третья - "НДС(0%)".

Поделиться этой страницей