Обычно делаю вот так (вроде понятнее): КоэффициентРаспределения = РаспределяемаяСумма/Таб.Итог("Количество"); Для Каждого Стр Из Таб Цикл Если Таб.Индекс(Стр)=Таб.Количество()-1 Тогда СуммаКРаспределению = РаспределяемаяСумма; Иначе СуммаКРаспределению = Окр(Таб.Количество()*КоэффициентРаспределения,2); КонецЕсли; РаспределяемаяСумма = РаспределяемаяСумма - СуммаКРаспределению;
Я накидал в Excel таблицу с вашим алгоритмом и "классическим" из начала видео, ваш показал себя более точным, так что возьму его на вооружение, спасибо. НО! Если ввести сумму распределения с копейками, то он распределяет большего нужного в последней строке, поэтому я бы для проверки ввёл новую переменную: СуммаИзменения = Мин(СуммаКРаспределению, РаспределяемаяСумма); И уже значение этой переменной использовать для сложения с Стр.Сумма и вычитания в РаспределяемаяСумма Надеюсь понятно описал
Поправка, я накосячил)) нельзя использовать метод "Мин", т.к. округления может быть в меньшую сторону. Нужно для последней строки распределять всю сумму остатка, тут в комментариях как раз есть такой пример
@@nanami265 суть его метода (на мой взгляд) как раз в том, что не нужно парится с последней строкой. и копейки не зависнут потому что в послдней строке базы у тебя всегда будет коэффициент распределения равен 1. То есть останется распределить на одну строку поэтому распределится вся сумма.
2 вопроса к видео, 1) как писсали выше - 100 длинна количества и суммы вроде как не ровны 10 (если это опись, а не задумывалось как дезинформация, то все ок, все мы люди) 2) а зачем пускать 3 раза цикл ради сообщить, можно же одним же обходом сначала сообщить исходное писать, ниже сразу пересчитанное в этом же цикле, если хочется выделить отдельно то что дано, то также минус цикл (последний цикл лишний, все можно в пересчете). Чем меньше циклов, тем быстрее работает код, ну да и люди смотрят разные, те кто начинает (а значит будут также повторять циклы пускать лишние, там где они и не нужны были по факту). Ну и есть минивопрос: если итоги делаются по тз и перед ним шел цикл по тз, а не проще ли было прогоняя сообщение, сразу собирать итог по количеству?
Сообщения - способ показать работу алгоритма, чтобы отделить логику алгоритма распределения от вывода и проверки результата ,ясное дело в реальной задаче будет 1 цикл с обработкой ТЧ документа.
Спасибо за комментарий. Запущено не запущено - это решение задачки на собеседовании - а если будет пустая база (создаешь ее сам - там этой БСП не будет). Даже если через БСП напишешь - то уже провалил собеседование. Советую уточнить на собеседовании а можно так или нельзя. Удачи)
@@Anastasiya-tm3rd Добрый день. Я привел задачи для тестирования на испытательном. Дают вам ноут. там пустая база. говорят сделать то-то. БСП установить можно - но откуда вы ее возьмете на собеседовании - будете на ИТС заходить вводить пароли (а если интернета нет или доступа к ИТС) или с флешки (а если прав администраторских нет на установку - так и потерял 10 минут на все - при чем собеседующий может все это видеть - а поставит вопрос о профессионализме.)
Да, очень важно уточнить вводные: я бы это решение оценила как ‘спасибо за креатив, вы знаете алгоритмы, но мне нужно ещё и знание БСП чтобы не тратить время на изобретение велосипеда’
Добрый день. Спасибо за вопрос. Здесь без переменной не обойтись, т.к. мы в последней строке в теле цикла вычитаем уже распределенную сумму. т.е. нам где то нужно хранить остаток для распределения, поэтому только переменная. Примечание: если бы не было такой операции, все равно в цикле лучше присвоить вызов функции переменной (в нашем случае .Итог()), т.к. каждый шаг цикла будет выполняться вызов функции и вычисляться по новой. Это опять же время и совсем не красиво. Вызов и выполнение функции всегда дольше по времени чем обращение к (получение значения) переменной. Качественный код начинается с таких мелочей. Удачи.)
СуммаНаЕдиницуКоличества = СуммаКРаспределению / ТЗ.Итог("Количество"); СуммаСРаспределениемИтоговая = ТЗ.Итог("Сумма") + СуммаКРаспределению; Для Каждого стр из ТЗ Цикл стр.Сумма = стр.Сумма + Окр(стр.Количество * СуммаНаЕдиницуКоличества,0); КонецЦикла; стр.Сумма = стр.Сумма + СуммаСРаспределениемИтоговая - ТЗ.Итог("Сумма") ;
ДополнитьТекстСообщенияСтрокойСообщения (ТекстСообщения, ТЗ); Сообщить(ТекстСообщения); КонецФункции &НаСервереБезКонтекста Процедура ДополнитьТекстСообщенияСтрокойСообщения(ТекстСообщения, ТЗ) Для Каждого стр из ТЗ Цикл ТекстСообщения = ТекстСообщения + СтрШаблон("%1 %2 %3",стр.Товар, стр.Количество, стр.Сумма) + Символы.ПС; КонецЦикла; КонецПроцедуры //Как то так я имел в виду
@@olegshpilevoy Можно - это первое что в голову приходит. В вашем решении возможны отклонения из-за округлений и распределиться может не та сумма которая по условию.
Добрый день. Спасибо за вопрос. Здесь в функции округления Окр() второй параметр 0, т.е. округление будет происходить до целого числа (согласно условию задачи). Коэффициент по мере выполнения цикла будет стремиться к 1, т.е. на последнем шаге будет равен 1. Если я не понял вопроса, то расскажите что вы хотели спросить.)
@@domrachevconsulting 14:01 РаспределяемаяСумма = 63, количество в 3 строке сделать единицу. Там округление идет от 0,5 - 2 раза должно в большую сторону округлить, не будет ли превышение суммы. Вот в чем вопрос.
А этот пример хороший. Со срезом последних вообще никуда не годилось. Видео про срез последних и предпоследних лучше удалить, чтобы дерзкие молодые головы не ссылались на него как на эталон.
Добрый день. Это было специально сделано - вы первый кто за полгода это увидели (или по крайней мере прокомментировали). Вас ждет приз. Да в программировании может быть много ошибок - не ошибается только тот кто ничего не делает.
@@domrachevconsulting Доброе утро! У меня был реальный кейс с ошибочной точностью числа, которая привела к "округлению" одной из величин ВГХ товара до нуля и при расчете объема тоже получилось якобы 0, что не позволило назначить рейсу транспорт. Поэтому теперь я очень внимательно за этим слежу :)
@@mnnovikov845 Спасибо за комментарий. Не помню в каком контексте сказал. Но "точность числа" распространённый оборот (можете в Google набрать). И в целом примечание: "Неидеальное действие лучше идеального бездействия."
Добрый день. У вас личные сообщения отключены. Можете написать на почту admin@domrachev.ru или +7(916)509-65-16 watsap. Нужно имя и адрес для отправки. Андрей Домрачев.
Привет. Бывают разные собеседования. Знание типовых тоже хорошо. Но в 1с сейчас деление идет специалистов на программистов и на консультантов-аналитиков. Последние как раз и работают с бизнесом (пользователями) и должны переложить бизнес-процессы на типовую. чего не хватает дописывает программист.
@@Anastasiya-tm3rd Да такое возможно - у меня был период в жизни где я делал "все абсолютно" в компании (сеть, сервера, компы, кассы, возил технику в сервис, закупал, админил, прокладывал новую сеть, менял картриджи, возил бухгалтера в налоговую). Мое мнение делать карьеру в известных компаниях, на проектах, где есть разделение обязанностей - собственно и зарплаты большие. Занимаюсь подбором программистов и консов - довольно часто вижу: "Хочу 300 000 рублей" - смотришь 10 лет на одном месте сидел (что там делать?)- внедрение из коробки - компания "Без имени", в команде не работал, управление проектами не знает - но гонору и амбиций до кучи.
@@domrachevconsulting я не про делал все, а про обязанности специалиста 1с, обычно это не просто кодер, чистый кодер никому не нужен. Замена картриджей очевидно не обязанность специалиста 1с
Алла, добрый день. Критика должна быть обоснована! Думал может на вашем канале можно поучиться делать не чепуху. Ничего не нашел. Удачи. Самоутверждайтесь в другом месте.
Обычно делаю вот так (вроде понятнее):
КоэффициентРаспределения = РаспределяемаяСумма/Таб.Итог("Количество");
Для Каждого Стр Из Таб Цикл
Если Таб.Индекс(Стр)=Таб.Количество()-1 Тогда
СуммаКРаспределению = РаспределяемаяСумма;
Иначе
СуммаКРаспределению = Окр(Таб.Количество()*КоэффициентРаспределения,2);
КонецЕсли;
РаспределяемаяСумма = РаспределяемаяСумма - СуммаКРаспределению;
Таб.Сумма = Таб.Сумма + СуммаКРаспределению;
КонецЦикла;
а если в последней строке база 0? )
Я накидал в Excel таблицу с вашим алгоритмом и "классическим" из начала видео, ваш показал себя более точным, так что возьму его на вооружение, спасибо.
НО! Если ввести сумму распределения с копейками, то он распределяет большего нужного в последней строке, поэтому я бы для проверки ввёл новую переменную:
СуммаИзменения = Мин(СуммаКРаспределению, РаспределяемаяСумма);
И уже значение этой переменной использовать для сложения с Стр.Сумма и вычитания в РаспределяемаяСумма
Надеюсь понятно описал
Поправка, я накосячил)) нельзя использовать метод "Мин", т.к. округления может быть в меньшую сторону.
Нужно для последней строки распределять всю сумму остатка, тут в комментариях как раз есть такой пример
@@nanami265 суть его метода (на мой взгляд) как раз в том, что не нужно парится с последней строкой. и копейки не зависнут потому что в послдней строке базы у тебя всегда будет коэффициент распределения равен 1. То есть останется распределить на одну строку поэтому распределится вся сумма.
@@mdilshod91 не всегда
Спасибо, можно ещё примеры для собеседований
2 вопроса к видео, 1) как писсали выше - 100 длинна количества и суммы вроде как не ровны 10 (если это опись, а не задумывалось как дезинформация, то все ок, все мы люди)
2) а зачем пускать 3 раза цикл ради сообщить, можно же одним же обходом сначала сообщить исходное писать, ниже сразу пересчитанное в этом же цикле, если хочется выделить отдельно то что дано, то также минус цикл (последний цикл лишний, все можно в пересчете). Чем меньше циклов, тем быстрее работает код, ну да и люди смотрят разные, те кто начинает (а значит будут также повторять циклы пускать лишние, там где они и не нужны были по факту).
Ну и есть минивопрос: если итоги делаются по тз и перед ним шел цикл по тз, а не проще ли было прогоняя сообщение, сразу собирать итог по количеству?
Сообщения - способ показать работу алгоритма, чтобы отделить логику алгоритма распределения от вывода и проверки результата ,ясное дело в реальной задаче будет 1 цикл с обработкой ТЧ документа.
Друзья. Скажите, пожалуйста, нужно выкладывать данные обработки куда-нибудь?
Выкладывайте😉😉
На какую позицию был собес с данной задачей? Заранее благодарен
Добрый день. На программиста (200 000 рублей удаленно). но там было три задачи. (это одна из них).
Как всё запущено) В библиотеке стандартных подсистем есть готовая функция ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам()
Спасибо за комментарий. Запущено не запущено - это решение задачки на собеседовании - а если будет пустая база (создаешь ее сам - там этой БСП не будет). Даже если через БСП напишешь - то уже провалил собеседование. Советую уточнить на собеседовании а можно так или нельзя. Удачи)
Катати там на вход подается КоэффициентыРаспределения , а тут показано как расчитать его. Задача простая , но интересно.
@@domrachevconsultingвпустую базу можно подключит бсп. Для чего эта база будет создаваться-то?
@@Anastasiya-tm3rd Добрый день. Я привел задачи для тестирования на испытательном. Дают вам ноут. там пустая база. говорят сделать то-то. БСП установить можно - но откуда вы ее возьмете на собеседовании - будете на ИТС заходить вводить пароли (а если интернета нет или доступа к ИТС) или с флешки (а если прав администраторских нет на установку - так и потерял 10 минут на все - при чем собеседующий может все это видеть - а поставит вопрос о профессионализме.)
Да, очень важно уточнить вводные: я бы это решение оценила как ‘спасибо за креатив, вы знаете алгоритмы, но мне нужно ещё и знание БСП чтобы не тратить время на изобретение велосипеда’
Если распределяемая сумма будет не 40, а напр 41 то будет ошибка?
нет
А что за такая запись таб.колонки.добавить()- выглядит как будто два вызова методов?
Привет. Здесь крупный объект встроенного языка 1с (ил можно назвать коллекция) "таб", у него есть объекты ".колонки", а метод последний ".добавить()".
А просто РаспределяемуюСумму нельзя разделить на Итог Количество и получить сумму на единицу количества? Зачем этот коэффициент?
Добрый день. Спасибо за вопрос. Здесь без переменной не обойтись, т.к. мы в последней строке в теле цикла вычитаем уже распределенную сумму. т.е. нам где то нужно хранить остаток для распределения, поэтому только переменная.
Примечание: если бы не было такой операции, все равно в цикле лучше присвоить вызов функции переменной (в нашем случае .Итог()), т.к. каждый шаг цикла будет выполняться вызов функции и вычисляться по новой. Это опять же время и совсем не красиво. Вызов и выполнение функции всегда дольше по времени чем обращение к (получение значения) переменной. Качественный код начинается с таких мелочей. Удачи.)
@@domrachevconsulting &НаСервереБезКонтекста
Функция РаспределитьНаСервере(ЗНАЧ СуммаКРаспределению)
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Товар",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100)));
ТЗ.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,3)));
ТЗ.Колонки.Добавить("Сумма",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,2)));
МассивСумм = СтрРазделить("0,100,130,150",",");
ТекстСообщения = "Исходные данные таблицы:" + Символы.ПС;
Для ш = 1 по 3 Цикл
нс = ТЗ.Добавить();
нс.Товар = "Номенклатура" + ш;
нс.Количество = ш;
нс.Сумма = МассивСумм[ш];
КонецЦикла;
ДополнитьТекстСообщенияСтрокойСообщения (ТекстСообщения, ТЗ);
ТекстСообщения = ТекстСообщения + "Измененные данные таблицы:" + Символы.ПС;
СуммаНаЕдиницуКоличества = СуммаКРаспределению / ТЗ.Итог("Количество");
СуммаСРаспределениемИтоговая = ТЗ.Итог("Сумма") + СуммаКРаспределению;
Для Каждого стр из ТЗ Цикл
стр.Сумма = стр.Сумма + Окр(стр.Количество * СуммаНаЕдиницуКоличества,0);
КонецЦикла;
стр.Сумма = стр.Сумма + СуммаСРаспределениемИтоговая - ТЗ.Итог("Сумма") ;
ДополнитьТекстСообщенияСтрокойСообщения (ТекстСообщения, ТЗ);
Сообщить(ТекстСообщения);
КонецФункции
&НаСервереБезКонтекста
Процедура ДополнитьТекстСообщенияСтрокойСообщения(ТекстСообщения, ТЗ)
Для Каждого стр из ТЗ Цикл
ТекстСообщения = ТекстСообщения + СтрШаблон("%1 %2 %3",стр.Товар, стр.Количество, стр.Сумма) + Символы.ПС;
КонецЦикла;
КонецПроцедуры
//Как то так я имел в виду
@@olegshpilevoy Можно - это первое что в голову приходит. В вашем решении возможны отклонения из-за округлений и распределиться может не та сумма которая по условию.
А как округлиться 0,5 и что с этим делать?
В какой момент? - не понял.
Добрый день. Спасибо за вопрос. Здесь в функции округления Окр() второй параметр 0, т.е. округление будет происходить до целого числа (согласно условию задачи).
Коэффициент по мере выполнения цикла будет стремиться к 1, т.е. на последнем шаге будет равен 1.
Если я не понял вопроса, то расскажите что вы хотели спросить.)
@@domrachevconsulting 14:01 РаспределяемаяСумма = 63, количество в 3 строке сделать единицу. Там округление идет от 0,5 - 2 раза должно в большую сторону округлить, не будет ли превышение суммы. Вот в чем вопрос.
А этот пример хороший. Со срезом последних вообще никуда не годилось. Видео про срез последних и предпоследних лучше удалить, чтобы дерзкие молодые головы не ссылались на него как на эталон.
Cпасибо за добрые слова.
Я не понимаю.
Говорит, сделаем точность числа = 10 и пишет 100.
Как можно быть невнимательным в программировании?
Добрый день. Это было специально сделано - вы первый кто за полгода это увидели (или по крайней мере прокомментировали). Вас ждет приз. Да в программировании может быть много ошибок - не ошибается только тот кто ничего не делает.
@@domrachevconsulting Доброе утро!
У меня был реальный кейс с ошибочной точностью числа, которая привела к "округлению" одной из величин ВГХ товара до нуля и при расчете объема тоже получилось якобы 0, что не позволило назначить рейсу транспорт. Поэтому теперь я очень внимательно за этим слежу :)
Я тоже не понимаю, как в слове длина можно услышать "точность числа". - "Тщательней надо, ребята."
@@mnnovikov845 Спасибо за комментарий. Не помню в каком контексте сказал. Но "точность числа" распространённый оборот (можете в Google набрать). И в целом примечание: "Неидеальное действие лучше идеального бездействия."
Добрый день. У вас личные сообщения отключены. Можете написать на почту admin@domrachev.ru или +7(916)509-65-16 watsap. Нужно имя и адрес для отправки. Андрей Домрачев.
Подскажите по Коэффициентам это алгебра 6 класс или пораньше? просто интересно стало. Спасибо за пример!
Добрый день. Я не помню - давно закончил и наверно все поменялось в программе.
Это точно задача с собес по 1с? Скорее собеседование по экселю
Привет. Да. Иногда полезно владеть Excel - при миграции данных, меппинге данных. Аналогов еще нет.
Абсолютно бесполезная задача, на собесе давать ее смысла никакого. На собесе спрашивают знание типовых.
@@Игорь-б4я7я а ты по всей видимости вообще не работал
Привет. Бывают разные собеседования. Знание типовых тоже хорошо. Но в 1с сейчас деление идет специалистов на программистов и на консультантов-аналитиков. Последние как раз и работают с бизнесом (пользователями) и должны переложить бизнес-процессы на типовую. чего не хватает дописывает программист.
@@domrachevconsulting на фикси далеко не всегда есть и аналитик и программист, обычно в одном лице все
@@Anastasiya-tm3rd Да такое возможно - у меня был период в жизни где я делал "все абсолютно" в компании (сеть, сервера, компы, кассы, возил технику в сервис, закупал, админил, прокладывал новую сеть, менял картриджи, возил бухгалтера в налоговую).
Мое мнение делать карьеру в известных компаниях, на проектах, где есть разделение обязанностей - собственно и зарплаты большие. Занимаюсь подбором программистов и консов - довольно часто вижу: "Хочу 300 000 рублей" - смотришь 10 лет на одном месте сидел (что там делать?)- внедрение из коробки - компания "Без имени", в команде не работал, управление проектами не знает - но гонору и амбиций до кучи.
@@domrachevconsulting я не про делал все, а про обязанности специалиста 1с, обычно это не просто кодер, чистый кодер никому не нужен. Замена картриджей очевидно не обязанность специалиста 1с
какая чепуха
Алла, добрый день. Критика должна быть обоснована! Думал может на вашем канале можно поучиться делать не чепуху. Ничего не нашел. Удачи. Самоутверждайтесь в другом месте.