Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 12:13

Среда. Вопрос 7

Автор mixqn, 13 мар 2013, 00:49

0 Пользователей и 3 гостей просматривают эту тему.

mixqn

Как правило по приезду из командировки менеджер проекта должен отчитаться перед бухгалтерией о потраченных средствах. У неопытного менеджера проектов на этом пути часто возникает множество проблем и данный этап становится для него испытанием чуть ли не большим, чем выполнение самого проекта. Для бывалых сотрудников этот этап является формальностью и с лёгкостью проходится. Но даже у самых опытных бывает, что возникают проблемы. Задачу, возникшую в одной из таких ситуаций вам и придётся решить.

Однажды Сергея Сергеевича вызвали в бухгалтерию с сообщением об якобы ошибочно составленном отчёте. Сергей Сергеевич, конечно же, смутился (он всегда по нескольку раз проверяет свои документы и уверен в безошибочности своих отчетов). В качестве доказательства бухгалтер предъявил листок бумаги с выписанными статьями расходов. Далее он просуммировал выписанные значения столбиком (а настоящие бухгалтеры всегда считают столбиком, не доверяя важные вычисления машинам). Как и стоило ожидать, вычисленная таким образом сумма не сошлась с величиной, указанной в отчёте.

Сергей Сергеевич знает, что спорить с бухгалтером бессмысленно — они практически никогда не ошибаются, но тем не менее он был уверен и в своей правоте... Значит ошибка возникла на этапе переписывания значений с отчета на листок бумаги. Осталось только найти несоответствие, но это не так просто, ведь слагаемых слишком много, да и бухгалтер переписывал их в странном, известном только ему одному порядке.

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

Исходные данные

Далее N строк по одному неотрицательному целому числу (длина 10) — слагаемые. Отдельный реквизит содержит сумму, указанную в отчёте Сергея Сергеевича (неотрицательное целое число, длиной 10). Ни в каких числах не может быть ведущих нулей, кроме того, ведущие нули не могли появиться в результате ошибки.

Результат

В случае если по входным данным можно найти число, в котором могла произойти описка — вывести строку «Ошибка находится в строке N. Правильное значение: K.», где N — порядковый номер числа K, которое могло быть неправильно записано бухгалтером. Если такого числа нет, следует вывести «Ошибка не найдена.» Возможно, бухгалтер обсчитался, и сумма слагаемых совпадает с подотчётной, тогда следует вывести строку «Ошибка отсутствует.»

Решение следует выкладывать в виде внешней обработки версий 1с от 8.1 до 8.3.

Примеры






исходные данныерезультат
12
26
45
Сумма:119
Ошибка находится в строке 2. Правильное значение: 62.
12
26
45
Сумма:109
Ошибка не найдена.
1071
300
1800
2700
4950
Сумма:10821
Ошибка отсутствует.


Предыдущий вопрос Следующий вопрос

soft

ТК это викторина, то предполагается, что есть вопросы, и на них можно быстренько ответить.
Обработку писать лень. Не нашел тут выкладывания файликов непосредственно на форум.

Я словами алгоритм напишу :)
1 - Высчитываем разницу между 2-мя суммами.
2 - Если разница 2-значная, то перепутаны разряды единиц и десятков, если 3-значная, сотен и десятком и тд.
3 - Раскладываем все числа в массив как в младщих классах. Число[0]= число единиц. Число[1] =  число десятков. Или тупо преобразуем число в строку. Из строки сможем дергать символы так же по индексу.
4 - Обходим все числа, меняем нужные разряды, если получили разницу, такую же как в п. 1 - ошибка найдена.

Как то так. А писать обработки - это денег стоит :)

IrinaO

Внешняя обработка прилагается
Добавлено: 13 мар 2013, 07:07


Извиняюсь, не поняла, прицепился файл или нет. На всякий случай выкладываю код модуля формы, на которой два реквизита - Строки и СуммаДОкумента и команда Поиск
&НаКлиенте
Процедура Поиск(Команда)
   НашлиОшибку=Ложь;
   Итог = Строки.Итог("Сумма");
   Если СуммаДокумента=Итог Тогда
      Сообщить("Ошибка отсутствует");
   Иначе
      Для Каждого Строка Из Строки Цикл
         НоваяСтрока=ПробуемНайтиОшибку(Строка.Сумма, Итог);
         Если НоваяСтрока<>0 Тогда
            Сообщить("Ошибка находится в строке " + (Строки.Индекс(Строка)+1) + ". Правильное значение:"+НоваяСтрока+".");
            НашлиОшибку=Истина;
            Прервать;
         КонецЕсли;
      КонецЦикла;
      Если Не НашлиОшибку Тогда
         Сообщить("Ошибка не найдена");
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ПробуемНайтиОшибку(Сумма, Итог)
  ОбрСимвол=1;
  СуммаСтр= Формат(Сумма,"ЧГ=0");
  Длина = СтрДлина(СуммаСтр);
  Пока ОбрСимвол < Длина Цикл
      НоваяСтрока = Число(Лев(СуммаСтр,ОбрСимвол-1)+Сред(СуммаСтр,ОбрСимвол+1,1) + Сред(СуммаСтр,ОбрСимвол,1) + Прав(СуммаСтр, Длина-ОбрСимвол-1));
      Если СуммаДокумента=Итог-Сумма +НоваяСтрока Тогда
         Возврат НоваяСтрока;
      КонецЕсли;   
      ОбрСимвол=ОбрСимвол+1;
  КонецЦикла;
  Возврат 0;   
КонецФункции // ПробуемНайтиОшибку()

toxicoff

Извиняйте, слишком лень писать обработку.
Но решения кроме перебора (по строкам, а потом перемещения символов и проверки с общей суммой), имхо нету.

Думал о последовательном суммировании многомерного массива, как в школе, столбиком. Но это слишком трудоёмко)

Верю что есть красивое решение)

DarKySiK


nidom

А теперь допустим, что бухгалтеру отчитались не за 3-4 суммы, а за сотню? И ошибку-опечатку он сделал не одну - тогда как быть? Почему-то в условии задачи этого нет, но я постарался предусмотреть и такой случай. Ведь может быть ситуация вроде вот этой:
Числа: 1010, 354, 8846, 776
Сумма: 10977
В этой ситуации ошибка может быть в трех цифрах сразу... Или это я случайно наткнулся на такую комбинацию чисел? Хотя это напрямую связано с числами стоящими рядом в числовом ряду 0,1,2...9.

Добавлено: 13 мар 2013, 11:35



serj1C

Основания идея - есть закономерность. От перестановки соседних цифр в числе разность должна быть кратной 9.
Если разность поделить на 9, то мы узнаем разряд, в котором стоит искать ошибку.
Дальше дело техники- перевернуть цифры, отнять от оригинала и сравнить с разностью.

Плюс проверена работа на отрицательных числах. Такие тесты должны быть.


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

Если ИтогРасчет=Сумма Тогда
Результат = "Ошибка отсутствует.";
Возврат;
КонецЕсли;

Разница = ИтогРасчет-Сумма;
Если Разница%9<>0 Тогда
Результат = "Ошибка не найдена.";
Возврат;
КонецЕсли;

Разряд = СтрДлина(Формат(?(Разница<0, -Разница, Разница)/9, "ЧГ=0")); // разряд, в котором надо искать ошибку
Минимум = Pow(10, Разряд);
Для Каждого Стр Из Таблица Цикл

Если ?(Стр.Число<0,-Стр.Число,Стр.Число) < Минимум Тогда
Продолжить;
КонецЕсли;
Строкой = Формат(Стр.Число, "ЧГ=0");
ОбратноеЧисло =
Сред(Строкой, 1, СтрДлина(Строкой)-Разряд-1)+
Сред(Строкой, СтрДлина(Строкой)-(Разряд-1), 1)+
Сред(Строкой, СтрДлина(Строкой)-(Разряд), 1)+
Сред(Строкой, СтрДлина(Строкой)+1-(Разряд-1), Разряд-1);
ОбратноеЧисло = Число(ОбратноеЧисло);

Если Разница = Стр.Число-ОбратноеЧисло Тогда
Результат = "Ошибка находится в строке "+(Таблица.Индекс(Стр)+1)+". Правильное значение: "+ОбратноеЧисло+".";
Возврат;
КонецЕсли;
КонецЦикла;

Результат = "Ошибка не найдена.";
Возврат;

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


Обработка на 8.2

Vit1501

примерно так

Spider244

Обработка во вложении.

evgeny.s

как по мне, так таких бухов лучше екселем научить пользоваться, чем изобретать, неизвестно что..
вот такой вопрос: а числа, для проверки, кто будет вводить? тоже бухгалтер? так он со своего листочка введет, также не правильно, и все у него сойдется, и ни какая обработка не докажет...
вообщем спорная задача....

Теги:
Рейтинг@Mail.ru

Поиск